2011-06-28 11 views
9

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

1)接続自体にエラーがあるか、またはタイプミスマッチのパラメータ。

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

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

答えて

12

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

、そしてNumberは50000

+0

+1。私はそれが私が使う方法だと思います。 – User

+1

独自の特定のエラーを認識するためにmsg_idのカスタム番号を指定できますが、データベースのsys.messagesテーブルに最初に登録する必要があり、50000を超える必要があります。http://msdn.microsoft.com/en/ -us/library/ms178592.aspx – stombeur

4

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

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

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

+0

+1となります。どうもありがとうございます。 – User

関連する問題