在处理之前我是否必须关闭()SQLConnection?

时间:2009-07-28 18:21:57

标签: c# asp.net using sqlconnection sqlcommand

根据我的其他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();
}

8 个答案:

答案 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()。

MSDN - SqlConnection.Dispose()

答案 5 :(得分:3)

不,无论如何让Use block为您调用Dispose(),因此无需拨打Close()

答案 6 :(得分:2)

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

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

答案 7 :(得分:1)

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