-3

RAISERROR を使用してメッセージ (ポップアップ メッセージ) をスローし、そのトランザクションをコミットする必要があります。オプションはありますか?

重大度18の場合、トランザクションはロールバックされました。重大度を10に変更して、次のように試しました

RAISERROR('Your Reference Number is %s',10,0,@param); 

これはトランザクションをコミットしますが、メッセージは表示しません。ここで必要なのは、メッセージをスローし、トランザクションをコミットする必要があることです

なにか提案を?

4

3 に答える 3

5

重大度が10を超えるRAISERRORは、ADO.Netクライアントによって例外のように扱われます。呼び出しコンテキストがどのように見えるかに応じて、これはトランザクションをロールバックする場合としない場合があります。クライアントでSqlTransactionまたはTransactionScopeを使用する場合、またはサーバー側でBEGIN TRY / BEGIN CATCHブロックを使用する場合、これによりトランザクションがロールバックされる可能性があります。ポイントは、RAISERRORはトランザクションをコミットもロールバックもせず、ロールバックまたはコミットする独自のコードであり、投稿から何をしているかを知ることができないということです。

重大度が10以下のRAISERRORは情報メッセージと見なされ、例外は発生しません。データベースエンジンのエラーの重大度を参照してください。これがおそらく、「メッセージが表示されない」と言う理由です(それ意味するものは何でも)。クライアント側のフレームワークは、情報メッセージを異なる方法で処理します。たとえば、ADO.NetはSqlConnection.InfoMessage接続でイベントを発生させますが、例外は発生しません。このイベントのアプリケーションにはおそらく何も設定されておらず、コードは単に情報メッセージを無視しています。たとえば、InfoMessageイベントの使用方法については、接続イベント(ADO.NET)を参照してください。

于 2011-07-22T15:35:22.227 に答える
5

「OK」メッセージを返すために例外を使用しないでください。あなたは ac# または Java プログラムではありません。例外は、「SHTF のために中止しました」を意味します

意味のあるデータを返すには、thsi を使用します。

SELECT 'Your Reference Number is ' + @param

典型的なテンプレート (私の回答からTRY CATCH ROLLBACK パターンを含むネストされたストアド プロシージャ? )

SET XACT_ABORT, NOCOUNT ON


BEGIN TRY

    BEGIN TRANSACTION

       [...Perform work, call nested procedures...]

    COMMIT TRANSACTION

    SELECT 'Your Reference Number is ' + @param

END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0
        ROLLBACK TRANSACTION
    RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
于 2011-07-22T14:15:10.207 に答える
0

WITH NOWAITパラメータを使用する必要があるようですRAISERROR-これにより、すぐにメッセージウィンドウに出力されます。

RAISERROR('Your Reference Number is %s',10,0,@param) WITH NOWAIT

于 2011-07-22T14:02:53.183 に答える