tryブロックで発生したばかりのSQLServerで同じ例外を再スローしたいと思います。同じメッセージをスローできますが、同じエラーをスローしたいと思います。
BEGIN TRANSACTION
BEGIN TRY
INSERT INTO Tags.tblDomain (DomainName, SubDomainId, DomainCode, Description)
VALUES(@DomainName, @SubDomainId, @DomainCode, @Description)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
declare @severity int;
declare @state int;
select @severity=error_severity(), @state=error_state();
RAISERROR(@@Error,@ErrorSeverity,@state);
ROLLBACK TRANSACTION
END CATCH
RAISERROR(@@Error, @ErrorSeverity, @state);
この行にはエラーが表示されますが、そのような機能が必要です。これにより、エラー番号50000のエラーが発生しますが@@error
、渡したエラー番号をスローしたいのですが、
フロントエンドでこのエラーをキャプチャしたいと思います。
すなわち
catch (SqlException ex)
{
if ex.number==2627
MessageBox.show("Duplicate value cannot be inserted");
}
この機能が欲しいです。これは、を使用して達成することはできませんraiseerror
。バックエンドでカスタムエラーメッセージを表示したくありません。
RAISEERROR
ErrorNoを渡すと、以下のエラーが返され、catchにスローされます。
Msg 2627, Level 14, State 1, Procedure spOTest_DomainInsert,
14行目UNIQUEKEY制約「UK_DomainCode」への違反。オブジェクト 'Tags.tblDomain'に重複するキーを挿入できません。ステートメントは終了されました。
編集:
ストアドプロシージャに実行する必要のある複数のクエリが含まれていることを考慮して、フロントエンドで例外を処理する場合、try catchブロックを使用しないことの欠点は何ですか?
raiserror
。これは、c#がthrow
。の後に終了する方法とは異なります。その動作に合わせたかっreturn
たcatch
ので、内部を追加しました。