过程中的 Raiserror (SQL Server 2014) 无法捕获客户端 (c#)
Posted
技术标签:
【中文标题】过程中的 Raiserror (SQL Server 2014) 无法捕获客户端 (c#)【英文标题】:Raiserror in procedure (SQL Server 2014) does not catch client side(c#) 【发布时间】:2017-03-10 17:26:57 【问题描述】:存储过程捕获块代码。
alter PROCEDURE [dbo].[TESTError]
(
)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
SELECT 5/0
END TRY
BEGIN CATCH
DECLARE @ErrorNumber INT
SELECT @ErrorNumber = ERROR_NUMBER()
RAISERROR
(N'The error code is: %d',
16, -- Severity.
1, -- State.
@ErrorNumber,
'');
END CATCH
END
上述存储过程在使用 SSMS 运行时抛出并显示错误。
.Net 客户端代码只有异常部分。
catch (SqlException ex)
string msg = string.Format("Error number: 0 / Message: 1", ex.Number, ex.Message);
当应用程序调用存储过程时,它不会捕获异常块。
任何提示或想法都会对我有所帮助。
【问题讨论】:
嗨,莫舍德!这个问题解决了吗?您需要进一步的帮助吗?请给我一个提示:如果这个问题得到了解决,您将非常好心,在(最佳)答案的投票计数器下方勾选接受检查。这将 1) 将此问题标记为已解决 2) 让追随者更容易找到最佳解决方案 3) 向回答者支付积分和 4) 向您支付积分。由于您自己已经越过了 15 点边界,因此您还被要求对贡献进行投票。这是说谢谢的方式。编码快乐! 【参考方案1】:catch (SqlException ex)
string msg = string.Format("Error number: 0 / Message: 1", ex.Number, ex.Message);
即使输入了这个 catch-block,你期望会发生什么?字符串变量会得到一个值,该值在下一微秒内消失......
无论如何:每当您处理专门的(类型化的)catch 块时,您应该有充分的理由不额外拥有一个通用的catch 块(作为您的最后一个专门的):
catch (System.Exception sysex)
string msg = string.Format("Error number: 0 / Message: 1", sysex.Number, sysex.Message);
//Do something with this information!
或者只是
catchthrow;
这取决于您的需求和调试工具/习惯...
【讨论】:
以上是关于过程中的 Raiserror (SQL Server 2014) 无法捕获客户端 (c#)的主要内容,如果未能解决你的问题,请参考以下文章
SQL存储过程内部RaisError客户端抓不住弹不出错误的解决