sqlexception.message在调用sqlserver存储proc时重复
-
02-10-2019 - |
题
我有一个存储的过程,该过程给出了足够友好的错误,我想向用户显示,但是当我从.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*/);
其他提示
发布后,我立即删除了打印语句,事实证明,打印语句通过异常消息的一部分传递。
不隶属于 StackOverflow