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

3

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

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

抱歉提出多个问题,但我认为我并不真正理解如何关闭连接。

3个回答

14

该方法将关闭连接(将其返回到连接池),并在之后如果仍然使用 SqlDataReader 将会抛出异常 (System.InvalidOperationException)。


那么,如果您接下来要关闭SqlConnection,还有必要关闭SqlDataReader吗?听起来只关闭SqlConnection是安全的。是这样吗? - Ender
2
@Ender,正确的做法是关闭它。关闭连接感觉不好,你可能应该使用using语句。 - Mehrdad Afshari
@Mehrdad 很棒,感谢你。我正在处理别人的代码,并想确保我真正理解发生了什么。这对我很有帮助! - Ender

9

与其担心关闭的顺序,不如使用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中可以使用"using"语句吗? - Christopher Mahan
是的,在1.1框架中使用语句是在C#中实现的,在2.0框架中则是在VB中实现的。 - Scott Ivey

5
实际的数据库连接将在您关闭/处理 SqlConnection 对象时关闭(返回到池中),因此数据库资源是安全的。
但是,您还应该关闭/处理 SqlDataReader ,否则它将保留对 SqlConnection 对象的引用,使它们都保留在内存中。如果您不这样做,最终器会处置 SqlDataReader 对象,然后 SqlConnection 对象也可以被收集回收,但是您无法控制何时发生。
在您关闭连接后, SqlDataReader 仍然可以部分使用,但不能真正依赖任何数据。它仍然在其缓冲区中具有某些数据,因此一些操作可能有效,但需要更多从数据库获取的数据的任何内容都会导致异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接