如果在 SqlDataReader 之前关闭 SqlConnection 会发生啥?

Posted

技术标签:

【中文标题】如果在 SqlDataReader 之前关闭 SqlConnection 会发生啥?【英文标题】:What happens if you close a SqlConnection before the SqlDataReader?如果在 SqlDataReader 之前关闭 SqlConnection 会发生什么? 【发布时间】:2009-06-02 19:04:37 【问题描述】:

如果在使用该连接调用 SqlDataReader 上的 Close() 之前调用 SqlConnection 对象上的 Close() 会发生什么?

实际上,我真正想知道的是关闭它们的顺序是否重要。调用 SqlConnection.Close() 是否会完全关闭连接,或者如果您不使用该连接在 SqlDataReader 上调用 Close(),它将保持打开状态?

很抱歉有多个问题,但我认为我并不真正了解连接关闭的工作原理。

【问题讨论】:

【参考方案1】:

它将关闭连接(将其返回到池中),SqlDataReader 会抛出异常 (System.InvalidOperationException),以防以后使用。

【讨论】:

那么,如果您之后要立即关闭 SqlConnection,是否有任何理由费心关闭 SqlDataReader?听起来只关闭 SqlConnection 是安全的。是这样吗? @Ender,正确的做法是关闭它。关闭连接感觉不太好。可能,无论如何你都应该使用using 语句。 @Mehrdad 酷,谢谢。我正在处理别人的代码,并想确保我真的理解发生了什么。这很有帮助!【参考方案2】:

与其担心如何关闭它们的顺序,不如将它们包装在 using 语句中。

// the following code has parts left out for brevity...
using(var conn = new SqlConnection( ... ))
using(var cmd = new SqlCommand( ... ))

    conn.Open();

    using(var reader = cmd.ExecuteReader())
    
        // do whatever with the reader here...
    

using 语句确保您的对象是关闭的,并且如果您相应地嵌套它们,它们的顺序是正确的。请参阅http://msdn.microsoft.com/en-us/library/yh598w02.aspx 了解更多信息。

【讨论】:

可以在 .NET 2.0 中使用“使用”语句吗? 是的,1.1 框架的 C# 和 2.0 框架的 VB 都有 using 语句。【参考方案3】:

当您关闭/处置SqlConnection 对象时,实际的数据库连接将被关闭(返回到池中),因此数据库资源是安全的。

但是,您也应该关闭/处置SqlDataReader,否则它将保留对SqlConnection 对象的引用,并将它们都保存在内存中。最终,如果你不这样做,终结器将释放 SqlDataReader 对象,然后 SqlConnection 对象也可以被收集,但你无法控制何时发生。

SqlDataReader 可以在您关闭连接后部分使用,但没有什么是您真正可以依赖的。它的缓冲区中仍然有一些数据,因此某些操作可能会起作用,但是任何需要从数据库中获取更多数据的操作都会导致异常。

【讨论】:

以上是关于如果在 SqlDataReader 之前关闭 SqlConnection 会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

c#你如何从sqldatareader返回数据集?

是否需要手动关闭和处置 SqlDataReader?

C# SqlDataReader 关闭方法

SqlDataReader的关闭问题,报错:“阅读器关闭时尝试调用 Read 无效”

c#是不是关闭sqlconnection和sqldatareader?

C#使用SqlDataReader读取数据库数据时CommandBehavior.CloseConnection参数的作用