質問

ユーザーに表示したいほどの友好的なエラーを提供するストアドプロシージャがありますが、.NETからそれを呼び出すと、2回出てきます。 SQL Server Management StudioからPROCを呼び出すと、一度だけ出てきます。

これは、保存されたProcの切り抜きバージョンです:

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

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

「エラー:悪いことが起こっているのが発見されています。

誰かがそれが二度出てくる理由を知っていますか?

これは、SQL Server 2008および.NET 3.5にあります

役に立ちましたか?

解決

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

理由:

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

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*/);

他のヒント

投稿後すぐに印刷ステートメントを削除し、例外メッセージの一部として印刷ステートメントが通過することがわかりました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top