【问题标题】:ASP.NET: Should connection be closed right after adapter has filled the dataset?ASP.NET:适配器填充数据集后是否应立即关闭连接?
【发布时间】:2011-06-12 04:11:23
【问题描述】:

我正在使用 GridView,想知道在

之后立即关闭连接对我来说是否更好
adapter.Fill(ds);

声明或者我应该等到我完成:

GridView.DataSource = ds;
GridView.DataBind();

我假设一旦数据集被填满,我就不再需要连接了。我错了吗?

【问题讨论】:

  • 谁要求您打开连接。如果适配器是SqlDataAdapter 并且ds 是DataSet,则不需要打开SqlConnection

标签: c# .net asp.net gridview adapter


【解决方案1】:

当您调用adapter.Fill(ds); 时,数据被加载到内存中,您可以在此语句后立即关闭连接。之后,当您将 ds 设置为 DataSource 到 gridview 时,它将从内存中绑定数据。

查看这篇文章以了解Working with Disconnected Data - The DataSet and SqlDataAdapter

【讨论】:

    【解决方案2】:

    调用Fill()后,您可以安全地关闭连接。题外话:在处理IDisposable(如SqlConnection)实体时使用using 块作为练习,因此,在这种情况下,您不必手动调用Close()

    【讨论】:

      【解决方案3】:

      SqlDataAdapter 在将数据填充到DataSet 后不需要connection,但是如果您在该行之后执行任何data manipulation,则需要再次打开它,我要做的是编写所有此类语句在finally 块中。

      【讨论】:

        【解决方案4】:

        根本不需要打开SqlConnection,因为DataSet 具有断开连接的架构。

        DataSet是主要的数据存储 ADO.NET 中的工具已断开连接 建筑学。与 DataReader 不同, DataSet 没有直接连接 通过连接到数据库 填充对象时。反而, 从数据库中填充 DataSet 首先创建一个 DataAdapter 对象 (例如 SqlDataAdapter) 提供者并将其与 SqlConnection 对象。然后 SqlDataAdapter 可以代理数据 通过发出一个检索数据集 针对数据库的 SqlCommand 通过SqlConnection,检索 数据,并填充数据集

        一个非常基本的用法示例是

        string sSQL = "SELECT * FROM Products";
        string sConnString = 
            "Server=(local);Database=Northwind;Integrated Security=SSPI;";
        SqlDataAdapter oDa = new SqlDataAdapter();
        DataSet oDs = new DataSet();
        using(SqlConnection oCn = new SqlConnection(sConnString))
        {
            SqlCommand oSelCmd = new SqlCommand(sSQL, oCn);
            oSelCmd.CommandType = CommandType.Text;
            oDa.SelectCommand = oSelCmd;
            oDa.Fill(oDs, "Products");
        }
        

        来源:Contrasting the ADO.NET DataReader and DataSet

        【讨论】:

        • -1:“不”打开或关闭 SQL 连接的需要与“断开连接”没有任何关系。要从数据库 (MSSQL/Oracle/...) 获取数据,必须建立连接。但是,SQL DataAdapter 控制连接,它(适配器)在 Fill 方法中处理打开和关闭。
        • @Cos Callis:我认为这是无知。我坚持认为OP根本不需要做conn.Close(),因为他没有做conn.open()
        • @Naveen,这不是你说的......你说 OP 不必conn.Close() 因为 DataSet is disconnected。那是在培养无知。 OP 不必做conn.Close() 因为适配器会处理它。
        • @Cos Callis:我说过这个。根本不需要打开 SqlConnection,因为 DataSet 具有断开连接的体系结构。请不要把话放在我的嘴边。你可以检查我的答案。我根本没有编辑任何东西。
        • @Naveen,在你的开场白中提到“AS”这个词(There is no need to open the SqlConnection at all as DataSet has a disconnected architecture. 的意思是“因为”,这不是在你嘴里说的话。你认为连接不被关闭的原因与数据集“断开连接”的想法有关。这是错误的:msdn.microsoft.com/en-us/library/905keexk.aspx(备注下的第一段)。要获取数据,您必须有一个连接。这对 OP(和你)有好处要了解有连接,它被打开并被适配器关闭
        猜你喜欢
        • 2015-06-21
        • 2014-07-02
        • 2023-04-11
        • 2014-06-14
        • 2013-12-07
        • 2020-05-07
        • 1970-01-01
        • 2015-08-21
        • 2017-03-20
        相关资源
        最近更新 更多