2009-06-02 131 views
2

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

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

对多个问题抱歉,但我不认为我真的了解连接关闭如何工作。

回答

12

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

+1

非常快的响应+1 – ichiban 2009-06-02 19:07:53

+0

因此,如果您之后只想关闭SqlConnection,那么是否有任何理由打扰关闭SqlDataReader?这听起来像只关闭SqlConnection是安全的。是这样吗? – Ender 2009-06-02 19:11:47

+2

@Ender,正确的做法是关闭它。关闭连接并不好。可能吧,无论如何,你应该使用`using`语句。 – 2009-06-02 19:13:34

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

3

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

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

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

相关问题