次のアプローチを使用して、データベースに対してクエリを実行し、データを読み取ります。
using(SqlConnection connection = new SqlConnection("Connection string"))
{
connection.Open();
using(SqlCommand command = new SqlCommand("SELECT * FROM TableName", connection))
{
using (SqlDataReader reader = command.ExecuteReader())
{
// read and process data somehow (possible source of exceptions)
} // <- reader hangs here if exception occurs
}
}
データの読み取りおよび処理中に、いくつかの例外が発生する可能性があります。問題は、呼び出し時に例外がスローDataReader
されてハングする場合です。Close()
理由はありますか?そして、この問題を適切な方法で解決するにはどうすればよいですか?try..catch..finally
の代わりにブロックを書き、リーダーを破棄する前にusing
呼び出すと、問題はなくなりました。command.Cancel()
finally
作業バージョン:
using(SqlConnection connection = new SqlConnection("Connection string"))
{
connection.Open();
using(SqlCommand command = new SqlCommand("SELECT * FROM TableName", connection))
{
SqlDataReader reader = command.ExecuteReader();
try
{
// read and process data somehow (possible source of exceptions)
}
catch(Exception ex)
{
// handle exception somehow
}
finally
{
command.Cancel(); // !!!
reader.Dispose();
}
}
}