2010-09-14 35 views
0

我有一个存储过程给出了一个足够友好的错误,我想向用户显示,但是当我从.net调用它时,它会出现两次。当我从sql server management studio调用proc时,它只会出现一次。SqlException.Message在调用sqlserver存储过程时重复

这里是存储过程的缩减版本,:

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但该消息中包含

"Error: Found Bad things are happening.\nError Found: Bad things are happening."

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

这是SQL Server 2008中上和.NET发布后3.5

回答

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

我立刻删除打印语句和事实证明,打印报表打通作为异常消息的一部分传递。