2009-06-02 22 views
2

その接続を使用してSqlDataReaderでClose()を呼び出す前に、SqlConnectionオブジェクトでClose()を呼び出すとどうなりますか?SqlDataReaderの前にSqlConnectionを閉じるとどうなりますか?

実際に、私が本当に知りたいのは、あなたがそれらを閉じる順序が重要かどうかということです。 SqlConnection.Close()を呼び出すと接続が完全に閉じるか、その接続を使用してSqlDataReaderでClose()を呼び出さないと開いたままになりますか?

複数の質問を申し訳ありませんが、接続のクローズの仕組みを本当に理解しているとは思いません。

答えて

12

接続を閉じて(プールに戻します)、SqlDataReaderは後で使用する場合を除いて例外(System.InvalidOperationException)をスローします。

+1

非常に高速な応答+1 – ichiban

+0

SqlDataReaderを終了するとすぐにSqlConnectionを閉じるつもりなら、何か理由がありますか? SqlConnectionだけを閉じても安全だと思います。そうですか? – Ender

+2

@Ender、そうする正しい方法はそれを閉じることです。それは接続を閉じるのに良い気分ではありません。おそらく、あなたは 'using'ステートメントをとにかく使っているはずです。 –

8

これを閉じる方法の順序を心配するのではなく、それらをステートメントを使用して囲みます。

// the following code has parts left out for brevity... 
using(var conn = new SqlConnection(...)) 
using(var cmd = new SqlCommand(...)) 
{ 
    conn.Open(); 

    using(var reader = cmd.ExecuteReader()) 
    { 
     // do whatever with the reader here... 
    } 
} 

usingステートメントは、オブジェクトが閉じられていることを確認し、それに応じて正しい順序でオブジェクトを閉じます。詳細はhttp://msdn.microsoft.com/en-us/library/yh598w02.aspxを参照してください。

+0

は.NET 2.0で "using"ステートメントを使用できますか? –

+0

はい、ステートメントを使用するのは、1.1フレームワークのC#と2.0フレームワークのVBでした。 –

3

SqlConnectionオブジェクトを閉じる/破棄すると、実際のデータベース接続は閉じられ(プールに返されます)、データベースリソースは安全です。

ただし、SqlDataReaderも閉じて処分する必要があります。そうしないと、SqlConnectionオブジェクトへの参照がメモリ内に保持されます。最終的にファイナライザは、SqlDataReaderオブジェクトを処理しないと破棄し、SqlConnectionオブジェクトを収集することもできますが、発生した時点を制御することはできません。

SqlDataReaderは、接続を閉じた後に部分的に使用できますが、本当に信頼できるものではありません。バッファーにはまだいくつかのデータがありますが、いくつかの操作は機能するかもしれませんが、データベースからより多くのデータを必要とするものは例外を引き起こします。

+0

詳しい説明はありがたいです。 – Ender

関連する問題