【问题标题】: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(),它将保持打开状态?

很抱歉有多个问题,但我认为我并不真正了解连接关闭的工作原理。

【问题讨论】:

    标签: c# .net sql database vb.net


    【解决方案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 可以在您关闭连接后部分使用,但没有什么是您真正可以依赖的。它的缓冲区中仍然有一些数据,因此某些操作可能会起作用,但是任何需要从数据库中获取更多数据的操作都会导致异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-05
      • 2011-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多