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

时间:2009-06-02 19:04:37

标签: c# .net sql database vb.net

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

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

对于多个问题感到抱歉,但我认为我真的不明白连接关闭是如何工作的。

3 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:8)

不要担心如何关闭它们的顺序,为什么不将它们包装在使用语句中。

// 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

答案 2 :(得分:3)

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

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

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