2009-03-30 7 views
9

でのOracleConnectionを閉じてください:、)接続またはOracleを閉じるにはどのように私はこれら二つのオブジェクトがあるだろう。NET

OracleConnection connection = new OracleConnection(connectionString); 
OracleCommand command = new OracleCommand(sql, connection); 

を、私はcommand.Disposeを(呼び出す必要がありますconnection.Dispose()、または両方?

は十分にこの良いです:

using(connection) 
{ 
    OracleDataReader reader = cmd.ExecuteReader(); 
    // whatever... 
} 

答えて

3

これは十分です。 usingステートメントはdisposeステートメントをラップします。したがって、例外がスローされても、あなたは安全です。リソースを処分するのが私の好ましい方法です。

using(OracleConnection connection = new OracleConnection(connectionString); ) 
{ 
    //Create a command object 
    using(OracleCommand command = new OracleCommand(sql, connection)) 
    { 
     using(OracleDataReader reader = cmd.ExecuteReader()) 
     { 
     } 

    } 
    // whatever... 
} 

私は「使用」の使用で考えて、あなたはブロック最後に...試みる注入するコンパイラを依頼され、最終的にブロックで、それはあなたのための使い捨てのオブジェクトを閉じます。

16
using (OracleConnection connection = new OracleConnection(connectionString)) 
{ 
    using (OracleCommand command = new OracleCommand(sql, connection)) 
    { 
     using (OracleDataReader reader = cmd.ExecuteReader()) 
     { 
     } 
    } 
} 

IDisposableを実装している場合は、作成する場合はusingブロックに入れます。

+0

は、実際に必要な内部usingsされるか、あるいは十分で「接続」の一つですか? –

+0

すべてのIDisposableオブジェクトを処分する必要があるため、それぞれの使用が必要です。あなたがしない場合は、接続を処分し、子供たちは残されます。 – Russ

+0

データベース接続(一般にID可能)のために許可されますが、親を破棄することで子を処理する入出力ストリームをカスケードすることはできません。 – Mac

3

usingあなたの接続が確実に閉じられます。 Disposeが呼び出される前に、CommandBehavior.CloseConnectionをコマンドのExecuteReaderメソッドに渡して閉じることもできます。

5

どちらの回答もかなり目標です。任意のIDisposeオブジェクトに対して常に.Dispose()を呼び出す必要があります。あなたが "使用する"でラップすることによって、コンパイラはいつもあなたのためにtry/finialyブロックを含めるようにします。ノートの

1ポイントあなたはネストを避けたい場合は、次のような同じコードを書くことができます。

using (OracleConnection connection = new OracleConnection(connectionString)) 
using (OracleCommand command = new OracleCommand(sql, connection)) 
using (OracleDataReader reader = cmd.ExecuteReader()) 
    { 
     // do something here 
    } 
+3

あなたはそのようなコードを書くことができますが、IMHOではそうはいかないでしょうか? –

+1

具体的な理由はありますか?私は自分自身でたくさん働いています(選択肢ではありません)ので、私は常に外部からのフィードバックを求めています。 – Russ

+1

合意。一見すると、誰かがどのオブジェクトが別のオブジェクトにカプセル化されているかを理解するでしょう。より多くのカッコとインデントを使用します。 – wonea

関連する問題