2009-04-21 3 views
3

は、私は次のことをやっていると仮定します。ADO.NET、事前コミットまたはロールバックなしでOracleConnectionを終了する:リークしますか?

using (OracleConnection conn = new OracleConnection(connStr)) 
{ 
    OracleTransaction trans = conn.BeginTransaction(); 
    OracleCommand command = new OracleCommand(cmdTxt, conn, trans); 
    // this statement is executed in a transaction context: 
    command.ExecuteNonQuery(); 
} 
// the using statement will dispose and thus close the connection. 
// a rollback is done implicitly 

私はtransaction.Rollback()を実行しませんでしたが、私のテストは、ロールバックが暗黙的に行われることを示しました。

私の質問です:このコードは接続やその他のものを漏らしますか?

Edit1:私はSystem.Data.OracleClient名前空間です。

Edit2:これは不合理なサンプルコードです。より現実的なシナリオは、usingステートメント内で例外が発生し、Commit()ステートメントがまだ実行されていない場合です。

EDIT3:答えから私は、これが良好であることを考える:

using (OracleConnection conn = new OracleConnection(connStr)) 
using (OracleTransaction trans = conn.BeginTransaction()) 
using (OracleCommand command = new OracleCommand(cmdTxt, conn, trans)) 
{ 
    command.ExecuteNonQuery(); 
    trans.Commit(); 
} 

はきれいに何を配置し、何が起こっているかを明確にすべきです。

答えて

2

漏れはありません。 using句を使用すると、コマンドが正常に完了したか例外が発生して失敗したかに関係なく、OracleConnectionが破棄され、トランザクションが処理されます。

しかし、OracleTransactionはIDisposableなので、トランザクションの前後にusing句を入れるとよいでしょう。

using (OracleTransaction trans = conn.BeginTransaction()) 
{ 
    // ... 
    trans.Commit(); 
} 

これにより、トランザクションがクリーンアップされていることがコードの読者に明確になります。特に、後続の拡張が同じ接続上で複数のトランザクションを実行する場合、重要になる可能性があります。

また、下記のJohnのコメントに記載されているように、OracleCommandの前後にusing文を入れると、すぐにクリーンアップすることができます。

+1

OracleCommandと同じです。使い捨てのものは、おそらく使用ブロックに入れて処分する必要があります。 –

+0

ありがとうジョン - 更新されました。 – itowlson

関連する問題