2010-12-08 12 views
31

このようなSQL Serverへのデータベースアクセスメソッドを実行しています。"using"ステートメントを使用している場合の接続の終了

 using (SqlConnection con = new SqlConnection(//connection string) 
    { 
    using (SqlCommand cmd = new SqlCommand(storedProcname, con)) 
    { 
     try{ 
      con.open(); 
      //data reader code 
     } 
     catch 
     { 

     } 
    } 
    } 

SqlCommandを終了または破棄する必要がありますか、使用するステートメントがそれを処理しますか?私はちょうど接続が開いている に掛けたくありませんおかげで

答えて

55

usingはあなたのためにそれを世話します。フードの下でSqlConnection.Dispose()SqlConnection.Close()メソッドを呼び出し、SqlCommand.Dispose()SqlCommand.Close()を呼び出します。追加の背景として

using文はfinallyIDisposableオブジェクトを配置try ... finallyためのシンタックスシュガーです。

+2

それは面倒ですが、私はまだそれを明示的に閉じ、using()ブロックを忘れたときの「バックアップ」としてのみ使用します。 –

+1

素晴らしいありがとう!返事をいただいた皆様に感謝します! – twal

+0

このような「機能」に依拠すると、危険で混乱する可能性があります。私はまだmarc_sと同じように明示的に閉じます。 TBH、私は明示的にそれを処分したいと思います。 – ThunderGr

1

範囲

using (SqlConnection con = new SqlConnection(//connection string) 
{ 
} 

が上、接続は自動的にランタイムによって配置されるであろう。だから心配しないでください

4

Philが言ったように、using句があなたのために世話をします。コンパイルされると、それはtry .. finallyで接続作成をラップし、最後に接続廃棄コールを配置します。

詳細については、using statement article at msdnを参照してください。

0

"using"はSqlCommandでは必要ないと思います。 SqlConnectionのための "Using"は、あなただけのために仕事をしたでしょう。 実際、接続はConnectionプールに送信されます。次のように

余談として
+4

いいえ - すべての使い捨てオブジェクトにusing()を使用する必要があります - '(SqlConnection .....)を使用するだけでは' SqlCommand'を処理しません –

+6

何でもIDisposableを実装する関数は、usingステートメントに配置する必要があります。ちょうど正しくないコードをすばやく見ることができるのがよい方法です。 – NotMe

12

、あなたは、コードをより簡潔で読みやすくすることができます。

using (SqlConnection con = new SqlConnection(/*connection string*/)) 
using (SqlCommand cmd = new SqlCommand(storedProcname, con)) 
{ 
    //... 
} 
+0

ああ、ありがとう! – twal

3

はいあなたのコードは、接続を閉じます、しかしそのtypcally本当に後に閉じられるように接続プールに戻って解放を意味し、 。

このコードスニペットを実行してからsp_whoを実行し、接続がまだ存在することを確認すると、それが原因です。

どうしてもその後、THSのSqlConnectionオブジェクトのClearAllPools 静的メソッドを使用します本当に(エッジケースを確認するために)閉じた接続が必要な場合

2

Usingキーワードが自動的にあなたのための接続を閉じます ので、あなたは必要ありません。毎回最後にconnection.close()と呼ぶことを心配してください。

+0

私は、これが受け入れられた答えとどのように異なっているか、よく分かりません。あなたは精緻化できますか? – Nicktar

関連する問題