如果在使用该连接在SqlDataReader上调用Close()之前在SqlConnection对象上调用Close()会发生什么?
实际上,我真正想知道的是你关闭它们的顺序是否重要。调用SqlConnection.Close()是否完全关闭连接,或者如果不使用该连接在SqlDataReader上调用Close(),它是否会保持打开状态?
对于多个问题感到抱歉,但我认为我真的不明白连接关闭是如何工作的。
答案 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
可以部分使用,但你真的不能依赖它。它的缓冲区中仍然有一些数据,因此某些操作可能会起作用,但是任何需要数据库中更多数据的操作都会导致异常。