我有一个存储的过程,该过程给出了足够友好的错误,我想向用户显示,但是当我从.NET调用它时,它会出现两次。当我从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 对象,然后我抓住一个 System.Data.SqlClient.SQLException 但是消息包含

“错误:发现坏事正在发生。 nerror发现:坏事正在发生。”

有人知道它两次出现的原因吗?

这在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