1

我有一个存储过程,它提供了一个足够友好的错误,我想向用户显示,但是当我从.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

我在一些使用对象ExecuteNonQuery()的c# 代码中调用它System.Data.SqlClient.SQLCommand然后我捕获一个System.Data.SqlClient.SQLException但消息包含

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

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

这是在 sql server 2008 和 .net 3.5 上

4

2 回答 2

1

请评论“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*/);
于 2010-09-16T10:43:58.060 回答
0

发布后我立即删除了打印语句,结果打印语句作为异常消息的一部分通过。

于 2010-09-14T10:25:29.440 回答