1

ユーザーに表示したい十分にわかりやすいエラーを提供するストアドプロシージャがありますが、.netから呼び出すと2回表示されます。SQL Server Management Studioからprocを呼び出すと、1回だけ出力されます。

ストアドプロシージャの縮小版は次のとおりです。

ALTER PROC [Production].[spDoSomething] (
            @PassedID int)
AS
BEGIN
    DECLARE @ErrorString nvarchar(500);
    BEGIN TRY
        ...
        RAISERROR('Bad things are happening.', 11 /*severity*/, 1 /*state*/);
        ...
    END TRY
    BEGIN CATCH
        SET @ErrorString = 'Error found:' + ERROR_MESSAGE();
        PRINT @ErrorString;
        RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
    END CATCH
END

ExecuteNonQuery()オブジェクトを使用していくつかのc#コードでこれを呼び出し、System.Data.SqlClient.SQLCommandキャッチしますSystem.Data.SqlClient.SQLExceptionが、メッセージには次のものが含まれます

「エラー:検出された悪いことが起こっています。\ nエラーが見つかりました:悪いことが起こっています。」

二度出てくる理由を知っている人はいますか?

これはSQLServer2008および.net3.5にあります

4

2 に答える 2

1

「PRINT@ErrorString;」にコメントしてください。声明。SQL Engineがエラーをスローすると、メッセージスタックで使用可能なすべてのメッセージが表示されます。

理由:

コードスナップの下で実行してみてください。

CREATE PROCEDURE ErrorHandler

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

   DECLARE @ErrorString nvarchar(500);
    BEGIN TRY
        RAISERROR('Bad things are happening.', 11 /*severity*/, 1 /*state*/);
    END TRY
    BEGIN CATCH
        SET @ErrorString = 'Error found:' + ERROR_MESSAGE();
        PRINT @ErrorString;
        PRINT 'Stack overflow'
        RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
    END CATCH
END
GO

EXEC ErrorHandler

SQLエンジンは3つのメッセージを生成します。

1. 1st for PRINT @ErrorString;

2. 2nd for PRINT 'Stack overflow'

3. 3rd for RAISERROR(@ErrorString, 11 /*severity*/, 1 /*state*/);
于 2010-09-16T10:43:58.060 に答える
0

投稿した直後にprintステートメントを削除しましたが、例外メッセージの一部としてprintステートメントが渡されたことがわかりました。

于 2010-09-14T10:25:29.440 に答える