代码之家  ›  专栏  ›  技术社区  ›  Adam Butler

调用sqlserver stored proc时出现sqlexception.message重复

  •  0
  • Adam Butler  · 技术社区  · 14 年前

    我有一个存储过程,它给出了一个足够友好的错误,我想向用户显示,但是当我从.NET调用它时,它会出现两次。当我从SQL Server Management Studio调用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() A的 System.Data.SqlClient.SQLCommand 对象然后我捕获 System.Data.SqlClient.SQLException 但信息中包含

    “错误:发现正在发生坏事情。\n错误发现:正在发生坏事情。”

    有人知道为什么会出现两次吗?

    它位于SQL Server 2008和.NET 3.5上

    2 回复  |  直到 14 年前
        1
  •  0
  •   vrluckyin    14 年前

    请对“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*/);
    
        2
  •  0
  •   Adam Butler    14 年前

    在发布之后,我立即删除了print语句,结果发现print语句作为异常消息的一部分被传递。