【问题标题】:Data Access Layer in an ASP.NET websiteASP.NET 网站中的数据访问层
【发布时间】:2014-07-25 16:51:21
【问题描述】:

我的项目中有一个 DAL 类文件,我的老师发给我并解释给我,但我并没有真正理解它。它有很多功能,我只了解其中的几个,比如连接到数据库或创建命令对象,但有两个我不明白:

public static DataTable GetTable(string str) 
{
    OleDbConnection con = DAL.GetConnection();

    OleDbCommand cmd = DAL.GetCommand(con, str);

    DataTable dt = new DataTable();
    OleDbDataAdapter adp = new OleDbDataAdapter();
    adp.SelectCommand = cmd;
    adp.Fill(dt);
    return dt;
}

public static int ExecuteNonQuery(string str)
{
    int num = -1;
    OleDbConnection con = DAL.GetConnection();
    con.Open();
    if (con.State == ConnectionState.Open)
    {
        OleDbCommand cmd = DAL.GetCommand(con, str);
        num = cmd.ExecuteNonQuery();
        con.Close();
    }
    return num;
}

【问题讨论】:

  • -1:你不明白哪一部分?

标签: asp.net sql data-access-layer


【解决方案1】:
public static DataTable GetTable(string str) 
{
    OleDbConnection con = DAL.GetConnection();

    OleDbCommand cmd = DAL.GetCommand(con, str);

    DataTable dt = new DataTable();
    OleDbDataAdapter adp = new OleDbDataAdapter();
    adp.SelectCommand = cmd;
    adp.Fill(dt);
    return dt;
}

此方法填充数据表,即将从数据库中提取的数据填充(或添加)到临时虚拟表(存储在内存中),以便您可以使用该数据在 UI 上显示。从数据库中获取后,您还可以在将其显示在 UI 上之前对其执行一些操作。

public static int ExecuteNonQuery(string str)
{
    int num = -1;
    OleDbConnection con = DAL.GetConnection();
    con.Open();
    if (con.State == ConnectionState.Open)
    {
        OleDbCommand cmd = DAL.GetCommand(con, str);
        num = cmd.ExecuteNonQuery();
        con.Close();
    }
    return num;
}

此方法执行非查询,即它对数据库执行操作。此操作本身可以是插入、更新或删除操作。这些操作是根据 SQL 语言语法指定的。

这只是一个简单的解释。在 Google 上搜索以进一步了解。

您可以查看此链接:http://msdn.microsoft.com/en-us/library/aa581776.aspx

它将帮助您了解数据访问层的基础知识。

希望对你有帮助!!!

【讨论】:

  • 谢谢您的回答,我唯一不清楚的是您所说的“临时表”的用途。第二个就像“接受添加、删除和更新”?
  • 存储在数据库中的数据被认为是“永久”存储的,而存储在内存中的数据是临时存储的。当您将数据库中的数据提取到代码中时,它仅在数据表变量加载到内存中并且在范围内时才可用。在某个阶段,当垃圾从内存中删除时会发生垃圾收集。这就是我说它的“临时”的原因。
【解决方案2】:

当您使用连接、命令或任何其他需要在其作用域末尾释放的对象时,学习使用 using 语句也很好。

using 语句中有几句话,例如:

  1. using 语句确保即使发生异常也会调用 Dispose
  2. 无需使用 Try 块然后在 finally 块上调用 dispose
  3. 一旦调用 Dispose,它还会导致对象本身超出范围。

参考:MSDN

所以你的代码也可以像这样改进:

    public static DataTable GetTable(string str)
    {
        using (var con = DAL.GetConnection())
        {
            using(var cmd = DAL.GetCommand(con, str))
            {
                return SetDataTable(cmd);
            }
        }
    }

    public static int ExecuteNonQuery(string str)
    {
        using (var con = DAL.GetConnection())
        {
            using (var cmd = DAL.GetCommand(con, str))
            {
                return cmd.ExecuteNonQuery();
            }
        }
    }

    private static DataTable SetDataTable(OleDbCommand cmd)
    {
        DataTable dt = new DataTable();
        OleDbDataAdapter adp = new OleDbDataAdapter();

        adp.SelectCommand = cmd;
        adp.Fill(dt);
        return dt;
    }

【讨论】:

  • 代码不是他写的。它被提供了。你在向错误的合唱团布道。
  • 嗨,正如我上面提到的,因为他正在学习数据对象,这只是为了改进他的代码并学习更多。就是这样。
猜你喜欢
  • 2012-06-21
  • 2011-06-24
  • 2013-06-21
  • 2011-12-10
  • 2011-02-14
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2023-01-28
相关资源
最近更新 更多