2012-08-20 17 views
7

可能性の重複:
Will a using block close a database connection?using節が使用されている場合、DbConnectionを閉じる必要はありませんか?

は、次の中の不要なdb.Close()ですか? Dispose()メソッドが呼び出され、私が知っていることについては

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

    db.Close(); 
} 
+1

いいえ、DBConnectionのdisposeメソッドの実装では、db.Close()を呼び出します。不要です –

+0

だからそれは不要ですか? – CJ7

+1

はい、(不要です)。 –

答えて

2

Close()が自動的に行われます。
したがって、db.Close();はここでは必要ありません。

1

閉じるブレースでは、Dispose()が呼び出されます。

私はDbConnectionで、Disposeメソッドは接続が閉じているかどうかをチェックすると思います。 いいえ、それはおそらく必要ではありませんが、私は個人的には良い練習であり、可読性を向上させると考えており、Closeが一方的に呼び出されるためパフォーマンスに影響しません。

9

using節が使用されている場合、DbConnectionを閉じる必要はありますか?

いいえ、using句を使用する場合、DbConnectionを閉じる必要はありませんか?

両端の接続を使用する場合には閉鎖を意味し、すべてのメモリを解放処分されますので、はい、それはここでは不要です。

DBConnectionIDisposableインタフェースを実装しているため、Disposeメソッドのclose関数はDBConnectionです。

しかし、いくつかの線が近い行の後であれば、それは

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

    db.Close(); //Useless 
} 

便利です。しかし、ここで、それはあなたが

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

} 

// Some more code which was previously inside using section. 
+3

+1接続を使用しないより多くのコードが存在する場合に手動で閉じるための素敵なデザイン。しかしその場合は、そのコードをusingブロックに含めないほうがよいでしょう。 – Aphelion

+0

@Aphelion:確かに、Close()の下にあるコードはブロック内にあるべきではありません。 – CJ7

+0

なぜdb.CLose()の下のコードが便利なのですか? –

1

抽出されたコードを実行することができ、その場合には

using (DbConnection db = GetDbConnection()) 
{ 
    // do data-access stuff 
    // ... 

    db.Close(); //Useful 

// Some more code 
} 

便利ですSqlConnection(Derived of DbConnection)clの実装からお尻:

public void Dispose() 
{ 
    Dispose(true); 
} 

protected override void Dispose(bool disposing) 
{ 
    if (disposing) 
    { 
    this.Close(); 
    } 
    base.Dispose(disposing); 
} 

usingキーワードはIDisposableインタフェースを使用しています。上記のメソッドはメソッドの実装です。接続を終了します。

4

ちょうど私がコードをチェックして:)

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

これはたDbConnectionから継承しているSqlConnectionオブジェクトの実装であることを確認するために。あなたが見る通り、this.Close()メソッド:

+0

私はここで 'using'文が' Dispose() 'または' Dispose(bool disposing) 'を呼び出すのではないかと疑問に思っていました –

+0

@Aphelion:plsでもこれに答えることができますか? –

+0

@CuongLe公開されている 'Dispose()'を呼び出します。その実装は 'Dispose(true)'を呼び出します。 – Aphelion

関連する問題