根据我的其他question here about Disposable objects,我们应该在使用块结束前调用Close()吗?
using (SqlConnection connection = new SqlConnection())
using (SqlCommand command = new SqlCommand())
{
command.CommandText = "INSERT INTO YourMom (Amount) VALUES (1)";
command.CommandType = System.Data.CommandType.Text;
connection.Open();
command.ExecuteNonQuery();
// Is this call necessary?
connection.Close();
}
答案 0 :(得分:103)
由于您有一个使用块,因此将调用SQLCommand的Dispose方法并关闭连接:
// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
答案 1 :(得分:24)
使用.NET Reflector反汇编SqlConnection:
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
在Dispose()
中调用Close()答案 2 :(得分:19)
using关键字将正确关闭连接,因此不需要额外调用Close。
来自SQL Server Connection Pooling上的MSDN文章:
“我们强烈建议您永远 你什么时候关闭连接 完成后使用它 连接将返回到 池。你可以使用 关闭或处理方法 连接对象,或通过打开全部 使用声明中的连接 在C#“
使用.NET Reflector的SqlConnection.Dispose的实际实现如下:
// System.Data.SqlClient.SqlConnection.Dispose disassemble
protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}
答案 3 :(得分:5)
使用Reflector,您可以看到Dispose
的{{1}}方法确实调用了SqlConnection
;
Close()
答案 4 :(得分:3)
不,在SqlConnection上调用Dispose()也会调用Close()。
答案 5 :(得分:3)
不,无论如何让Use block为您调用Dispose()
,因此无需拨打Close()
。
答案 6 :(得分:2)
不,在调用Dispose之前没有必要关闭连接。
某些对象(如SQLConnections)可以在调用Close时重用,但在调用Dispose之后不能重用。对于其他调用Close的对象与调用Dispose相同。 (ManualResetEvent和Streams我认为这样做)
答案 7 :(得分:1)
不,SqlConnection类继承自IDisposable,当遇到使用结束(对于连接对象)时,它会自动调用SqlConnection类上的Dispose。