代码之家  ›  专栏  ›  技术社区  ›  Ender

如果在sqldatareader之前关闭sqlconnection,会发生什么?

  •  2
  • Ender  · 技术社区  · 15 年前

    如果在使用该连接对sqldatareader调用close()之前对sqlconnection对象调用close(),会发生什么情况?

    实际上,我真正想知道的是,你关闭它们的顺序是否重要。调用sqlconnection.close()是否完全关闭连接,或者如果不使用该连接在sqldatareader上调用close(),它是否仍保持打开状态?

    很抱歉有这么多问题,但我不太明白连接关闭是如何工作的。

    3 回复  |  直到 15 年前
        1
  •  13
  •   Mehrdad Afshari    15 年前

    它将关闭连接(将其返回池),并 SqlDataReader 会引发异常( System.InvalidOperationException )以防以后使用。

        2
  •  8
  •   Scott Ivey    15 年前

    与其担心如何关闭它们的顺序,不如用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 更多信息。

        3
  •  3
  •   Guffa    15 年前

    当您关闭/释放 SqlConnection 对象,因此数据库资源是安全的。

    但是,您应该关闭/处置 SqlDataReader 另外,否则它将保留对 连接对象 对象,将它们都保存在内存中。最终,终结器将处理 数据阅读器 如果你不这样做,然后 连接对象 对象也可以被收集,但您无法控制何时发生这种情况。

    这个 数据阅读器 可以在关闭连接后部分使用,但不能真正依赖任何内容。它的缓冲区中仍然有一些数据,因此某些操作可能有效,但是任何需要数据库中更多数据的操作都会导致异常。