2009-07-28 34 views
100

私の他のquestion here about Disposable objectsでは、使用ブロックの最後の前にClose()を呼び出す必要がありますか?SQLConnectionが破棄される前に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(); 
} 

答えて

96

(ManualResetEventとストリームは、私がこのように振る舞うと思います) :Reflectorを使用して

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
     this._userConnectionOptions = null; 
     this._poolGroup = null; 
     this.Close(); 
    } 

    this.DisposeMe(disposing); 
    base.Dispose(disposing); 
} 

それは廃棄(の内側()Closeを呼び出し)

+1

_this._poolGroup = null; _は接続が接続プールに戻っていないことを意味しますか?だから私はn-1の接続を持つでしょうか? –

1

いいえ、SQLConnectionクラスは、IDisposableインターから継承し、(接続オブジェクトの)使用の終了が検出されたとき、自動的にSQLConnectionクラスに廃棄を呼び出します。

3

いいえ、使用ブロックにはDispose()と表示されますので、Close()に電話する必要はありません。

+0

申し訳ありませんが、私は閉じる()終了を呼び出し、ほとんどのオブジェクトのためのIDisposableインターを実装し、閉じる()メソッドを持っていると述べている必要がありますとにかくあなたのために舞台裏でDispose()を呼び出す。 –

+6

それ以外の方法はありません - 'Dispose()'は 'Close()'を呼びますか? – Town

+1

それは通常、両方です。なんらかの理由で、彼らは、CloseがDisposeを呼び出すことを実装することを決めました。SqlConnectionの場合、これは大きな問題ではありませんが、StreamWritersは閉じてからDisposeすると例外がスローされます。私の推測では、人々が今期待しているものであるため、単に行動を変えることはないだろう。 –

2

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

一部のオブジェクト(SQLConnectionsなど)は、Closeを呼び出すために再利用できますが、Disposeを呼び出した後は使用できません。 Closeを呼び出す他のオブジェクトは、Disposeを呼び出すのと同じです。 SqlConnectionオブジェクトの

// 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); 
} 
20

分解.NET Reflectorを使用してから:あなたが使用してブロックを持っているので、SqlCommandオブジェクトのDisposeメソッドが呼び出されます、それは接続を閉じます

+1

@statenjason:disassemblers line .net reflectorをどのように活用すればよいのでしょうか? – odiseh

+3

@odiseh .NET Reflectorをダウンロードし、reflector.exeを実行して、.net DLL(標準ライブラリを含む)を開くことができます。 Visual Studioのオブジェクトブラウザに似たツリー構造を提供しますが、任意のクラスまたはメソッドを右クリックして「逆アセンブル」をクリックすると、C#またはVBのいずれかでソースを返します。オプション。 – statenjason

3

、あなたはその目を見ることができますe 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); 
} 
15

usingキーワードを使用すると接続が正しく閉じられ、Closeへの余分な呼び出しは不要です。 SQL Server Connection Pooling上のMSDNの記事から

「私たちは強く 接続が プールに戻されますようにあなたがそれを使用して 終了したら、あなたはできますが、常に が接続を終了することをお勧めします。これは「

01を閉じる またはC#でusingステートメント 内のすべての の接続を開くことによって、 Connectionオブジェクト、または の方法を廃棄のいずれかを使用してください次のように.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); 
} 
+1

MSDNリンク+1 - 私は次の人のようにreflector \ ILspyが好きですが、ドキュメントは私の答えを見つけるために行きたいところです。 – mlhDev

関連する問題