2010-12-20 9 views
3

私のDALレイヤーで "using"ブロックを使いたいです。私はコントロールが使用ブロック範囲を出るときに、この接続オブジェクトが自動的に配置されることを知って使用してブロック内の初期化にSqlConnectionオブジェクトのでC#.NETブロックを使用

using (SqlConnection con = new SqlConnection("connection string")) 
{ 
    Command object 
    Reader object 
} 

等。

しかし、私は使用ブロック内にCommandオブジェクトとReaderオブジェクトを作成しています。私は明示的にそれらを閉じるか、別の "using"ブロックを書く必要がありますか?

+0

わかりません。別の「使用」ブロックを書き込む必要はありません。ブロックスコープがオブジェクトを超えた後:コマンドとリーダーが破棄されます。 – Pratik

+0

@Pratik、 'using(...)'カッコ内に明示的に置かれたオブジェクトだけが実際に配置されます。ここでは、コマンドとリーダーは処理されません。 – Lucero

答えて

4

コマンドとリーダーにはusingを使用するか、明示的に閉じる必要があります。

私は通常、このようにそれをコーディング:

var sql = "SELECT * FROM table"; 
using (var cn = new SqlConnection(connectionString)) 
using (var cmd = new SqlCommand(sql, cn)) { 
} 

これはidentationsの数を制限します。

1

IDisposeを実装するすべての項目に対してusingブロックを作成できます。したがって、接続のブロック内に入れ子になったブロックをそれぞれ使用して、使用後に正しく廃棄されるようにすることができます。

3

通常、それらのブロックも同様に使用します。

using (SqlConnection con = new SqlConnection("connection string")) 
{ 
    con.Open(); 
    using (SqlCommand cmd = con.CreateCommand()) 
    { 
     cmd.CommandText = "select * from table"; 
     using (SqlDataReader reader = cmd.ExecuteReader()) 
     { 
      ... 
     } 
    } 
} 
2

IDisposableインターフェイスをサポートするすべてのコードに対してusingブロックを書く価値があります。このようにして、希少なリソースを解放するためにできることを実行したことを確認します。

0

あなたの接続とリーダーに使用したくない場合は、using()またはfinallyブロックを使用する必要があります。リーダーの場合、リーダーが閉じられるまで接続は閉じられません。また、私はusing()が接続が閉じられることを100%保証していないが、try-finallyブロックに変換されていて、どんな状態でも実行されるので、その背後にある理由はわかりません。

関連する問題