繁体   English   中英

使用“使用”时最后关闭SqlConnection

[英]Close SqlConnection in the Finally when using “Using”

我想关闭最后的SqlConnection,因为使用并没有真正关闭它,连接池变满了。 但是我没有意识到什么是正确的方法,因为conn对象在finally部分中不再可达。

try 
{
    using (var conn = new SqlConnection(_dbconnstr)) 
    {
        //...
    }
}
catch (Exception ex)
{
    //...
}
finally 
{
    conn.Close //?!?!?!?!???
}
using (var conn = new SqlConnection(_dbconnstr)) 
{
    //code
}

透露给:

SqlConnection conn = new SqlConnection(_dbconnstr);
try
{
    //code
}
finally
{
    conn.Dispose();
}

所以你应该处理错误,但你可以忘记关闭连接。

您不需要在finally块中关闭conn using块将处理为您关闭连接。 (事实上​​,在这种情况下,你可能根本不需要try...finally除非你有其他资源需要在finally处理。)

using块将转换为如下所示:

var conn = new SqlConnection(/*...*/);
try
{
    // ...
}
finally
{
    if (conn != null)
        ((IDisposable)conn).Dispose();
}

Dispose的方法SqlConnection对象将在被称为finally的块,以及Dispose方法继续呼吁Close你。

退出using块会在对象上调用.Dispose() ,因为SqlConnection将关闭连接和任何打开的资源。

所以tryfinally阻止是不需要的。

根据我的理解,连接对象的Dispose()方法将关闭Connection。 您不需要显式调用Connection.Close。

Using关闭连接的方式是好的。 也许您可能忘记关闭一些DataReader了?

AFAIK,以下使用声明:

using (var conn = new SqlConnection(_dbconnstr)) 
{

}

相当于:

SqlConnection conn;
try
{
    //`using` scope operations are executed here
    conn = new SqlConnection(_dbconnstr));

}
catch
{
    //exceptions are bubbled
    throw;
}
finally
{
    //Dispose is always called
    conn.Dispose();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM