web-dev-qa-db-ja.com

usingステートメントを使用したSqlCommand

ほとんどのサンプルでSqlCommandがこのように使用されていることがわかりました

using (SqlConnection con = new SqlConnection(CNN_STRING))
{
    using (SqlCommand cmd = new SqlCommand("Select ID,Name From Person", con))
    {
        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataSet ds = new DataSet();
        da.Fill(ds);           
        return ds;
    }
}

「使用」ステートメントを使用している理由を知っています。ただし、SqlCommandにはClose()メソッドが含まれていないため、usingステートメント内で実際に使用する必要があります。

20
Omer K

IDisposable も実装しているため。

Usingステートメントの目的は、コントロールが使用の最後に達すると、使用中のオブジェクトを破棄し、メモリを解放することです。その目的は、自動接続のクローズだけではなく、基本的には接続オブジェクトを破棄し、明らかにそれによって接続も閉じられます。

その目的は、Usingステートメント内で使用したリソースを解放することです。

MSDN:

原則として、IDisposableオブジェクトを使用する場合は、usingステートメントで宣言してインスタンス化する必要があります。 usingステートメントは、オブジェクトのDisposeメソッドを正しい方法で呼び出します(前に示したように使用する場合)。また、Disposeと呼ばれます。 usingブロック内では、オブジェクトは読み取り専用であり、変更または再割り当てできません。

Usingステートメントは、オブジェクトのメソッドを呼び出している間に例外が発生した場合でも、Disposeが呼び出されるようにします。オブジェクトをtryブロック内に配置し、Disposeブロック内でfinallyを呼び出すことにより、同じ結果を得ることができます。実際、これはusingステートメントがコンパイラーによって変換される方法です。前述のコード例は、コンパイル時に次のコードに展開されます(オブジェクトの制限されたスコープを作成するための余分な中括弧に注意してください)。

注意:

リソースオブジェクトをインスタンス化し、変数をusingステートメントに渡すことができますが、これはベストプラクティスではありません。この場合、おそらく管理されていないリソースにアクセスできなくなったとしても、制御はusingブロックを離れた後もオブジェクトはスコープ内に残ります。つまり、完全に初期化されなくなります。 usingブロックの外側でオブジェクトを使用しようとすると、例外がスローされる危険があります。このため、一般に、usingステートメントでオブジェクトをインスタンス化し、そのスコープをusingブロックに制限する方が適切です。

28
Ehsan Sajjad

SqlCommandIDisposableを実装します。usingステートメントは、usingブロックが終了する前に.Dispose()を呼び出します。 SqlCommand.Dispose()が何をするのかはわかりませんが、終了したインスタンスで.Dispose()を呼び出すことをお勧めします。つまり、おそらくデータベース接続をクリアします。

5
Jason Evans