2009-09-14 23 views
9

私はすでにを使用してを使用してDBCommandをラップすると、以下のado.netコードを持っています。下の接続を明示的に閉じる必要がありますか?dbCommand.Close()も接続を閉じますか?

おかげで、

 public static void ExecuteSQL(int Id) 
     { 
      Database db; 
      const string sqlCommand = "Stored Procedure Name"; 
      try 
      { 
       db = DatabaseFactory.CreateDatabase(); 
       using (DbCommand dbCommand = db.GetStoredProcCommand(sqlCommand)) 
       { 
        db.AddInParameter(dbCommand, "p_Id", DbType.Int32, Id); 
        db.ExecuteNonQuery(dbCommand); 
**//do I have to close connection explicitely here??** 
        if (dbCommand.Connection.State != ConnectionState.Closed) 
        { 
         dbCommand.Connection.Close(); 
        } 
        dbCommand.Connection.Dispose(); 
       } 
      } 
      catch (Exception ex) 
      { 
       Logger.Log.Error(ex.StackTrace, ex); 
       throw; 
      } 
     } 

答えて

4

はい、あなたはusingブロックに包まれている場合は、すべてあなたが現在あなたのコードでそうであるように、あなたがは、明示的DbConnectionを閉じる必要があります、DbCommandです。ただし、Disposeに電話するだけで十分です。 CloseDisposeの両方を呼び出す必要はありません。

+0

@Satyaはこの場合正しいと思いますが、あなたの答えは実際には間違っています。 – Coops

+0

@CodeBlend:誰かがエンタープライズライブラリを使用している場合、はい、その答えは正しいです。しかし、コードは 'Database'のようなクラスを参照しますが、質問の内容とタグはEntLibを参照しません。結果として、質問されたときに質問に対する回答を人々が探している場合、これはまだ正しいでしょう。 –

-1

いいえ、あなたはしないでください。

使用ブロックの最後にヒットすると、disposeが呼び出されます。

+2

私はなぜこれがupvotedされているのか分かりません。あなたは絶対に接続を閉じる必要があります。この質問は、**コマンド**ではなく、**接続**を処理しなければならないことに関するものです。コマンドだけで "使用する"ことはできません。 –

+0

彼のコードのコメントと、明示的にdbCommand.Connection.CloseとdbCommand.Connection.Dispose()を呼び出しているという事実に基づいて、私は彼が既にコマンドを使用ブロックにラップしていたので、それが必要かどうか尋ねていました。 db.Closeとdb.Disposeのようなものを呼び出す必要があるかどうかを尋ねていた場合は、100%正確です。私はちょうどそれが彼の質問だったとは思わなかった。 – cptScarlet

+0

"DBCommandをラップするために既に使用している場合は、*明示的に*接続を閉じる必要があります。 –

2

http://www.willydev.net/descargas/WillyDev_EntLib_TestGuide.pdf

アプリケーションブロックは、それが彼らと一緒に終了した後、データベース接続を閉じます。たとえば、ExecuteNonQueryメソッドの実装にはusingステートメントが含まれています。 usingステートメントは、リソースを取得し、ステートメントを実行し、リソースを破棄します。この場合、リソースはデータベース接続です。 ExecuteReaderメソッドの場合、アプリケーションブロックは、リーダーが終了した後にCommand-Behavior.CloseConnectionメソッドを使用して接続を閉じます。

+0

ここで「答え」と記された回答は完全に間違っていますか? – Coops

1

この投稿は古いですが、私たちがEnterpriseLibraryでこのブロックを使用している場合、接続が閉じられていると確信しています(コードブロックのクラスとメソッド名が私に考えさせます)。 質問をした人は、EnterbriseLibraryについて話しているかどうかを明示的に検討する必要があります。 finallyブロックを使用してテストしました。はい、DbCommandを使用するブロックの後に接続が自動的に閉じられます。

+0

コードを投稿できますか?あなたが言っていることが正しいかどうかを証明するための例がありますか? – Coops

関連する問題