私の他の ここでの使い捨てオブジェクトに関する質問 、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();
}
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 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()を呼び出します
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);
}
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);
}
いいえ、SqlConnectionでDispose()を呼び出すと、Close()も呼び出されます。
いいえ、UsingブロックでDispose()
を呼び出すので、Close()
を呼び出す必要はありません。
いいえ、Disposeを呼び出す前に接続を閉じる必要はありません。
一部のオブジェクト(SQLConnectionsなど)は、Closeの呼び出し後に再利用できますが、Disposeの呼び出し後には再利用できません。 Closeを呼び出す他のオブジェクトの場合、Disposeを呼び出すのと同じです。 (ManualResetEventとStreamsはこのように動作すると思います)
いいえ、SqlConnectionクラスはIDisposableを継承し、(接続オブジェクトの)使用の終わりに到達すると、自動的にSqlConnectionクラスのDisposeを呼び出します。