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

Joh*_*ski 111 c# asp.net using sqlcommand sqlconnection

根据我在这里关于Disposable对象的另一个问题,我们应该在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();
}
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 106

由于您有一个使用块,因此将调用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);
}
Run Code Online (Sandbox Code Playgroud)


sta*_*son 25

使用.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);
}
Run Code Online (Sandbox Code Playgroud)

它在Dispose()中调用Close()

  • @odiseh只需下载.NET Reflector,运行reflector.exe,就可以打开任何.net DLL(包括标准库).它为您提供了类似于Visual Studio的对象浏览器的树结构,但是,您可以右键单击任何类或方法,然后单击"反汇编"它将在C#或VB中将源返回给您,无论您选择哪个选项. (3认同)

Tho*_*att 20

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

从有关SQL Server连接池的MSDN文章:

"我们强烈建议您在使用完毕后始终关闭连接,以便将连接返回到池中.您可以使用Connection对象的Close或Dispose方法,或打开一个内部的所有连接来执行此操作. 在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);
}
Run Code Online (Sandbox Code Playgroud)


Aar*_*els 5

使用Reflector,你可以看到实际调用的Dispose方法;SqlConnectionClose()

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