如果您在调用使用该连接的SqlDataReader的Close()之前调用SqlConnection对象的Close(),会发生什么情况呢?
实际上,我想知道的是关闭它们的顺序是否重要。调用SqlConnection.Close()是否完全关闭连接,如果您不调用使用该连接的SqlDataReader的Close(),连接是否仍然保持打开状态?
抱歉提出多个问题,但我认为我并不真正理解如何关闭连接。
该方法将关闭连接(将其返回到连接池),并在之后如果仍然使用 SqlDataReader
将会抛出异常 (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 仍然可以部分使用,但不能真正依赖任何数据。它仍然在其缓冲区中具有某些数据,因此一些操作可能有效,但需要更多从数据库获取的数据的任何内容都会导致异常。
using
语句。 - Mehrdad Afshari