6

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() メソッドの後でエラーが発生したことを確認するにはどうすればよいですか?

ティア

4

2 に答える 2

3

私はなんとか回避策を見つけました。イベント ハンドラーを含むクラスにプロパティを追加しました。エラーが発生した場合は、そのクラスにエラー フラグ プロパティを送信しました。このプロパティは、ExcecuteNonQuery() の呼び出し後に読み取ることができます。エラーが発生した場合は、クリーンアップ コードを実行できます。返信いただきありがとうございます。

于 2012-03-16T17:20:26.763 に答える
1

SqlExceptionクラスの代わりにクラスを使用しExceptionます。そして、調べますe.Errors

于 2012-03-16T16:11:05.880 に答える