2016-10-06 4 views
0

私はDbコネクションが次の会場で閉鎖されますか?

Public static OracleDataReader(CommandType ct,string command,params OracleParameter[] cp) 
{ 
    OracleConnection cn = new OracleConnection(getconnection()); 
    try 
    { 
     return ExecuteReader(cn,ct,command,cp); 
    } 
    catch 
    { 
     cn.close(); 
    } 
} 

qry = "select * from emp"; 
using(IDataReader dr = OracleFacoty.ExecuteReader(CommandType.Text,qry,null) 
{ 
    while(dr.read()) 
    { 
     //Do operation 
    } 
} 
を次のように私はそれを使用するには、次のようにあるすべての読み取りのためのファクトリクラスを書いている私は、データを読み取るためにC#コードで

を作成し、接続上の問題を持っています

私の質問は、ファクトリメソッドで開かれた接続は自動的に閉じられますか、呼び出しメソッドから接続を渡し、データの読み込みが完了したら接続を閉じる必要があります。

答えて

0

usingステートメントは、それがその中にインスタンス化されますときには、リソースオブジェクトをインスタンス化してから使用してステートメントに変数を渡すことができますが、

を行ったように、このアプローチに関するMSDNからこれをチェックアウト適切にDB接続を配置しますが、これはベストプラクティスではありません。この場合、オブジェクトは、たとえおそらく管理されていないリソースにアクセスできなくても、コントロールが使用ブロックを離れると有効範囲内にとどまります。つまり、完全に初期化されなくなります。使用ブロックの外でオブジェクトを使用しようとすると、例外がスローされる危険があります。この理由から、usingステートメントでオブジェクトをインスタンス化し、そのスコープをusingブロックに限定する方が一般的に適しています。

おそらく接続を使用してインスタンス化し、そのインスタンスをファクトリメソッドに渡して操作を実行することをお勧めします。最後に、データベース接続を適切に処理します。

https://msdn.microsoft.com/en-us/library/yh598w02.aspx

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection(v=vs.110).aspx

+0

私はステートメントを使用して接続を作成していませんか?それでもIreaderオブジェクトとの接続を無効にします – Yogesh

+0

私は答えを編集して使用している間に接続をインスタンス化していなかったことを認識しませんでした。 – inan

0

あなたのコードを見ることによって、私はあなたがは、新しい接続にあなたがそれを呼び出すたびに作成し、いくつかを返すクラスの静的メソッドを持っている

  • を言うことができますDataTableオブジェクト(?)
  • ExecuteReader()の範囲内でエラーが発生するたびに例外が発生します押されて接続が終了します。

が、2番目のスニペットで、あなたが直接、私は信じているとして、いかなる例外を処理しないであろう、ExecuteReader()を呼んでいるOracleDataReaderを使用していません。

また、最初のスニペットでは、エラーが発生した場合にのみ接続が終了します。エラーがなければ、接続は終了せず、メモリリークが発生し、いくつかの試みの後では最大限の接続制限を超えます。

すべての通話に新しい接続が必要な場合は、Cn.close()finally{}ブロックに入れます。

関連する問題