は、私は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
スレッド内でコードを実行し、その関数内でthread.abortを呼び出すことができます。 – SamFisher83
+1:私は読んでから何かを学ぶところが大好きです。 – NotMe