Do I have to Close() a SQLConnection before it gets disposed?

根据我的其他 关于一次性物品的问题,我们应该在 using 块结束之前调用 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();
}
45597 次浏览

No, calling Dispose() on SqlConnection also calls Close().

MSDN-SqlConnection. Dispose ()

不,SqlConnection 类从 IDisposable 继承,当遇到使用结束(对于连接对象)时,它会自动调用 SqlConnection 类上的 Dispose。

不,使用块为您调用 Dispose(),所以没有必要调用 Close()

不,在调用 Dispose 之前没有必要关闭连接。

有些对象(如 SQLConnections)可以在调用 Close 之后重用,但不能在调用 Dispose 之后重用。对于调用 Close 的其他对象,与调用 Dispose 相同。(ManualResetEvent 和 Streams 我认为是这样的)

因为您有一个 using 块,所以将调用 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);
}

通过使用 .NET 反射器反汇编 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 ()

Using 反光镜, you can see that the Dispose method of SqlConnection actually does call Close();

protected override void Dispose(bool disposing)
{
if (disposing)
{
this._userConnectionOptions = null;
this._poolGroup = null;
this.Close();
}
this.DisposeMe(disposing);
base.Dispose(disposing);
}

Using 关键字将正确关闭连接,因此不需要额外调用 Close。

来自 SQLServer 连接池上的 MSDN 文章:

”我们强烈建议 关闭连接时,你是 完成使用它,以便 连接将返回到 您可以使用 Close or Dispose methods of the 连接对象,或通过打开所有 Using 语句中的连接 C #”

SqlConnection. Dispose 使用 .NET 反射器的实际实现如下:

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