调用sqlserver存储过程时SqlException.Message重复

时间:2010-09-14 10:18:47

标签: c# sql-server tsql sqlexception executenonquery

我有一个存储过程,它提供了一个足够友好的错误,我想向用户显示,但是当我从.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()对象的System.Data.SqlClient.SQLCommand在一些c#代码中调用它,然后我捕获System.Data.SqlClient.SQLException但消息包含

  

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

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

这是在sql server 2008和.net 3.5

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

请评论“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*/);