SQL ステートメントを実行する次のコードがあります。
int rowsEffected = 0;
using (SqlConnection dbConnection = new SqlConnection(dbConnectionString))
{
try
{
dbConnection.InfoMessage += new SqlInfoMessageEventHandler(dbConnection_InfoMessage);
dbConnection.FireInfoMessageEventOnUserErrors = true;
dbConnection.Open();
SqlCommand command = dbConnection.CreateCommand();
command.CommandTimeout = 0;
command.CommandText = sqlStatement;
rowsEffected = command.ExecuteNonQuery();
}
catch (Exception e)
{
// Handle exception
}
}
長時間実行される SQL ステートメントは、適切な重大度の値で RAISERROR を使用してエラーを発生させることにより、SqlInfoMessageEventHandler を介して進行状況を報告できます。
FireInfoMessageEventOnUserErrors を true に設定する理由は、これがないと、SQL ステートメントからのすべてのメッセージが、ExecuteNonQuery() が返されたときに一度にすべて処理されるだけだからです。この値を true に設定すると、進捗メッセージは SQL ステートメントによって発生したときに処理されます。
プロパティの名前が示すように、イベント ハンドラーは、SQL ステートメントによる進行状況のフィードバック用に予約されている特定の重大度レベルだけでなく、エラー時にも起動します。
進行状況フィードバックのイベント ハンドラーは次のようになります。
public void dbConnection_InfoMessage(object sender, SqlInfoMessageEventArgs e)
{
if (e.Errors.Count > 0)
{
throw new Exception("Something bad happened");
}
// Report progress
}
ご覧のとおり、'e' 内のプロパティによってエラーが発生したことを検出できますが、例外をスローしても何も起こりません。実行が catch ブロックに落ちることを望んでいましたが、そうではありません。
ExcecuteNonQuery() メソッドの後でエラーが発生したことを確認するにはどうすればよいですか?
ティア