如果在 SqlDataReader 之前关闭 SqlConnection 会发生啥?
Posted
技术标签:
【中文标题】如果在 SqlDataReader 之前关闭 SqlConnection 会发生啥?【英文标题】:What happens if you close a SqlConnection before the SqlDataReader?如果在 SqlDataReader 之前关闭 SqlConnection 会发生什么? 【发布时间】:2009-06-02 19:04:37 【问题描述】:如果在使用该连接调用 SqlDataReader 上的 Close() 之前调用 SqlConnection 对象上的 Close() 会发生什么?
实际上,我真正想知道的是关闭它们的顺序是否重要。调用 SqlConnection.Close() 是否会完全关闭连接,或者如果您不使用该连接在 SqlDataReader 上调用 Close(),它将保持打开状态?
很抱歉有多个问题,但我认为我并不真正了解连接关闭的工作原理。
【问题讨论】:
【参考方案1】:它将关闭连接(将其返回到池中),SqlDataReader
会抛出异常 (System.InvalidOperationException
),以防以后使用。
【讨论】:
那么,如果您之后要立即关闭 SqlConnection,是否有任何理由费心关闭 SqlDataReader?听起来只关闭 SqlConnection 是安全的。是这样吗? @Ender,正确的做法是关闭它。关闭连接感觉不太好。可能,无论如何你都应该使用using
语句。
@Mehrdad 酷,谢谢。我正在处理别人的代码,并想确保我真的理解发生了什么。这很有帮助!【参考方案2】:
与其担心如何关闭它们的顺序,不如将它们包装在 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 了解更多信息。
【讨论】:
可以在 .NET 2.0 中使用“使用”语句吗? 是的,1.1 框架的 C# 和 2.0 框架的 VB 都有 using 语句。【参考方案3】:当您关闭/处置SqlConnection
对象时,实际的数据库连接将被关闭(返回到池中),因此数据库资源是安全的。
但是,您也应该关闭/处置SqlDataReader
,否则它将保留对SqlConnection
对象的引用,并将它们都保存在内存中。最终,如果你不这样做,终结器将释放 SqlDataReader
对象,然后 SqlConnection
对象也可以被收集,但你无法控制何时发生。
SqlDataReader
可以在您关闭连接后部分使用,但没有什么是您真正可以依赖的。它的缓冲区中仍然有一些数据,因此某些操作可能会起作用,但是任何需要从数据库中获取更多数据的操作都会导致异常。
【讨论】:
以上是关于如果在 SqlDataReader 之前关闭 SqlConnection 会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
SqlDataReader的关闭问题,报错:“阅读器关闭时尝试调用 Read 无效”
c#是不是关闭sqlconnection和sqldatareader?
C#使用SqlDataReader读取数据库数据时CommandBehavior.CloseConnection参数的作用