121

根据我关于 Disposable objects 的其他问题,我们应该在 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();
}
4

8 回答 8

112

由于您有一个 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);
}
于 2009-07-28T18:26:16.823 回答
26

使用.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()

于 2009-07-28T18:28:07.413 回答
22

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

来自关于SQL Server 连接池的 MSDN 文章:

“我们强烈建议您在使用完连接后始终关闭它,以便将连接返回到池中。您可以使用 Connection 对象的 Close 或 Dispose 方法来执行此操作,或者通过打开一个 在 C# 中使用语句"

SqlConnection.Dispose 使用.NET Reflector的实际实现如下:

// 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);
}
于 2009-10-30T17:56:56.783 回答
5

使用Reflector可以看到 的Dispose方法SqlConnection实际上确实调用了Close()

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close();
    }
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}
于 2009-07-28T18:29:59.093 回答
4

不,在 SqlConnection 上调用 Dispose() 也会调用 Close()。

MSDN - SqlConnection.Dispose()

于 2009-07-28T18:23:45.020 回答
3

不,无论如何都有 Using 块Dispose()为您调用,因此无需调用Close().

于 2009-07-28T18:23:48.483 回答
2

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

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

于 2009-07-28T18:26:10.833 回答
1

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

于 2009-07-28T18:23:45.190 回答