![](/img/trans.png)
[英]Where to close SqlDataReader object and SqlConnection object?
[英]What happens if you close a SqlConnection before the SqlDataReader?
如果在使用该连接在SqlDataReader上调用Close()之前在SqlConnection对象上调用Close()会发生什么?
实际上,我真正想知道的是你关闭它们的顺序是否重要。 调用SqlConnection.Close()是否完全关闭连接,或者如果不使用该连接在SqlDataReader上调用Close(),它是否会保持打开状态?
很抱歉有多个问题,但我认为我真的不明白连接关闭是如何工作的。
它将关闭连接(将其返回到池),并且SqlDataReader
将抛出异常( System.InvalidOperationException
)以防System.InvalidOperationException
使用它。
而不是担心如何关闭它们的顺序,为什么不将它们包装在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 。
当您关闭/部署SqlConnection
对象时,将关闭(返回到池)实际的数据库连接,因此数据库资源是安全的。
但是,您应该关闭/处置SqlDataReader
,否则它将保留对SqlConnection
对象的引用,将它们保存在内存中。 最终,如果你不这样做,终结器将处理SqlDataReader
对象,然后也可以收集SqlConnection
对象,但你无法控制何时发生这种情况。
关闭连接后, SqlDataReader
可以部分使用,但是你真的不能依赖它。 它的缓冲区中仍然有一些数据,因此某些操作可能会起作用,但任何需要数据库中更多数据的操作都会导致异常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.