10

RAISERRORデータベース側の致命的なエラーをアプリケーションに通知するために使用する3〜4個のストアドプロシージャ(必要に応じて変更できます)があります。これらのストアドプロシージャの一部は、C#側から、を使用して実行されますがExecuteNonQuery、その他は。を使用して実行されExecuteReaderます。現時点では、これらのコマンドをtry { ... } catch (SqlException ThisSqlException) { ... }ブロックでラップしていますが、問題は、この例外が、個別に処理する必要がある少なくとも2つのシナリオでスローされることです。

1)接続自体のエラー、またはパラメータの障害やタイプの不一致によるエラー。と

RAISERROR2)明示的に使用するたびに発生するエラー。

RAISERRORこれはWCFアプリケーションであるため、例外の性質(コマンドによるものかどうかに関係なく)に基づいて、クライアントアプリケーションにさまざまなフィードバックを返す必要があります。では、どうすれば両方の状況を区別できますか?

4

2 に答える 2

17

このRAISERRORコマンドには、エラーのタイプを識別するために使用できるmsg_idパラメーターが含まれています。この値は、SqlException.Numberプロパティを介してアプリケーションに提供されます。このようにして、システムで定義されているカスタムエラーメッセージを含むストアドプロシージャによって発生した例外を特定できます。

RAISERRORがテキスト文字列エラーメッセージで呼び出された場合、 Number50000になります。

于 2011-06-28T15:52:52.610 に答える
5

をキャッチすると、詳細なエラーメッセージを含むコレクションをSqlException調べることができます。Errors

これらSqlErrorのオブジェクトには、エラーコード、メッセージなどの非常に詳細な情報が含まれていました。

その情報を使用すると、接続ベースのエラーと、自分で発生したエラーを簡単に区別できるはずです。

于 2011-06-28T15:51:18.957 に答える