如果在SqlDataReader之前关闭SqlConnection会发生什么?

End*_*der 2 .net c# sql database vb.net

如果在使用该连接在SqlDataReader上调用Close()之前在SqlConnection对象上调用Close()会发生什么?

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

很抱歉有多个问题,但我认为我真的不明白连接关闭是如何工作的.

Meh*_*ari 13

它将关闭连接(将其返回到池)并在以后使用它时SqlDataReader抛出异常(System.InvalidOperationException).

  • @Ender,这样做的正确方法是关闭它.关闭连接感觉不太好.也许你应该使用`using`语句. (2认同)

Sco*_*vey 8

而不是担心如何关闭它们的顺序,为什么不将它们包装在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...
    }
}
Run Code Online (Sandbox Code Playgroud)

using语句确保您的对象被关闭,并且如果您相应地嵌套它们,则以正确的顺序.有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/yh598w02.aspx.


Guf*_*ffa 5

当您关闭/处置对象时,实际的数据库连接将被关闭(返回到池中)SqlConnection,因此数据库资源是安全的。

但是,您应该关闭/处置SqlDataReader也,否则它将保留对该SqlConnection对象的引用,将它们都保留在内存中。SqlDataReader最终,如果您不这样做,终结器将处置该对象,然后该SqlConnection对象也可以被收集,但您无法控制何时发生。

SqlDataReader关闭连接后,它们可以部分使用,但没有任何东西是您真正可以依赖的。它的缓冲区中仍然有一些数据,因此某些操作可能会起作用,但任何需要数据库中更多数据的操作都会导致异常。