我想在Last中关闭SqlConnection,因为使用时并没有真正关闭它并且连接池已满。但是我没有意识到什么是正确的方法,因为conn对象在finally部分中不再可用。
try
{
using (var conn = new SqlConnection(_dbconnstr))
{
//...
}
}
catch (Exception ex)
{
//...
}
finally
{
conn.Close //?!?!?!?!???
}
答案 0 :(得分:13)
using (var conn = new SqlConnection(_dbconnstr))
{
//code
}
透露:
SqlConnection conn = new SqlConnection(_dbconnstr);
try
{
//code
}
finally
{
conn.Dispose();
}
所以你应该处理错误,但你可以忘记关闭连接。
答案 1 :(得分:8)
您无需关闭conn
块中的finally
。 using
块将处理为您关闭连接。 (事实上,在这种情况下,您可能根本不需要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
会关闭连接和任何打开的资源。
因此不需要try
,finally
块。
答案 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();
}