过程中的 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客户端抓不住弹不出错误的解决

如何处理 SQL 数据库中的 RAISERROR

SQL Server2012中的Throw语句尝试 RAISERROR和THROW比较

sql server数据库中raiserror函数的用法

SQL 抛出异常的例子 RAISERROR 的使用

sql MS SQL RAISERROR