web-dev-qa-db-ja.com

SQLConnectionを破棄する前にClose()する必要がありますか?

私の他の ここでの使い捨てオブジェクトに関する質問 、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();
}
110
John Bubriski

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);
}
105
CMS

。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()を呼び出します

24
statenjason

Usingキーワードを使用すると接続が正しく閉じられるため、Closeを余分に呼び出す必要はありません。

SQL Server接続プーリング に関するMSDNの記事から:

「接続がプールに返されるように、使用が終了したら常に接続を閉じることを強くお勧めします。これを行うには、ConnectionオブジェクトのCloseメソッドまたはDisposeメソッドを使用するか、C#のusingステートメント内のすべての接続を開くことにより "

。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);
}
19
Thomas Bratt

Reflector を使用すると、DisposeSqlConnectionメソッドが実際にClose()を呼び出すことがわかります。

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

いいえ、SqlConnectionでDispose()を呼び出すと、Close()も呼び出されます。

MSDN-SqlConnection.Dispose()

3
Justin Niessner

いいえ、UsingブロックでDispose()を呼び出すので、Close()を呼び出す必要はありません。

3
Jason Evans

いいえ、Disposeを呼び出す前に接続を閉じる必要はありません。

一部のオブジェクト(SQLConnectionsなど)は、Closeの呼び出し後に再利用できますが、Disposeの呼び出し後には再利用できません。 Closeを呼び出す他のオブジェクトの場合、Disposeを呼び出すのと同じです。 (ManualResetEventとStreamsはこのように動作すると思います)

2
pipTheGeek

いいえ、SqlConnectionクラスはIDisposableを継承し、(接続オブジェクトの)使用の終わりに到達すると、自動的にSqlConnectionクラスのDisposeを呼び出します。

1
blparker