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