2012-03-15 10 views
5

は、私はSQL文を実行するコードの以下のビットがありますは、ExecuteNonQueryを(使用している場合、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に設定するのは、ExecuteNonQuery()が返されたときにSQLステートメントからのすべてのメッセージが一度に処理されるためです。この値を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」内プロパティで発生した場合に検出することができますが、例外をスローすることは何もしません。 。私は実行がキャッチブロックに落ちることを望んでいたが、これはそうではない。

ExcecuteNonQuery()メソッドの後にエラーが発生したと判断する方法を教えてください。

TIA

+0

スレッド内でコードを実行し、その関数内でthread.abortを呼び出すことができます。 – SamFisher83

+1

+1:私は読んでから何かを学ぶところが大好きです。 – NotMe

答えて

3

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

+0

答えを返すようにマークしてください – Marcin

+0

私は同様のことをしなければなりませんでしたが、外部スレッドがDBコマンドオブジェクトにアクセスしなければならなかったため、SQL呼び出しをブロックするために最後に使用されたものを保存しました。別のスレッド。 – Brain2000

1

使用SqlExceptionクラスの代わりに、Exceptionクラス。そして次に見てくださいe.Errors

+0

答えをありがとう。私は実際に例外を使用していない、私はカスタム例外を使用していますが、サンプルコードのためにこれを例外に変更しました。 ExcecuteNonQuery()を呼び出すコードでe.Errorsにアクセスすることはできません。 – millie