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

时间:2011-04-06 09:03:53

标签: c# .net sql

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

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

6 个答案:

答案 0 :(得分:13)

using (var conn = new SqlConnection(_dbconnstr)) 
{
    //code
}

透露:

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

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

答案 1 :(得分:8)

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

using块将转换为以下内容:

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

Dispose对象的SqlConnection方法将在finally块中调用,Dispose方法会继续为您调用Close

答案 2 :(得分:2)

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

因此不需要tryfinally块。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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();
}