【问题标题】:Catch SQL raise error in C#在 C# 中捕获 SQL 引发错误
【发布时间】:2014-03-02 11:13:54
【问题描述】:

我在 SQL 过程中生成了引发错误:

RAISERROR('Already exist',-10,-10)

但我无法在 C# 中使用以下代码捕获它

catch (SqlException ex)
{
    bResult = false;                   
    if (ex.Errors[0].Number == -10)
    {
        CommonTools.vAddToLog("bInsertNewUser", "ManageUsers", ex.Message);
        if ((savePoint != null))
            savePoint.Rollback();
    }
} 

如何在 C# 中捕获引发的错误?

【问题讨论】:

  • 您的具体问题是什么? try-catch 不起作用吗?
  • 在调试器中运行,你是否得到了一个在 catch 子句中结束的异常,如果是这样,ex.Errors[0].Number 中的内容是什么?

标签: c# sql-server raiserror


【解决方案1】:

SEVERITY 值小于或等于 10 的 RAISERROR 不会在 C# 端捕获,因为我认为它们只是警告,正如您从 列表Database Engine Error Severities

11 到 16 之间的 SEVERITY 值是用户可以纠正的错误,因此,例如,您可以尝试:

RAISERROR('Already exist',16,1)

否则,您可以从上面的列表中选择另一个错误代码,或者,如果您确实需要它,请使用 sp_addmessage 准备您自己的自定义错误消息。

【讨论】:

    【解决方案2】:

    你的 if 语句是失败的地方。假设集合中的第一个错误确实是您要查找的错误(可能不是)。

    SqlError.Number 不是您在RAISERROR 中设置的值。

    使用SqlError.Class 检索错误的严重性,或使用SqlError.State 检查状态(在您的示例中两者都是-10。很难说出您的意思):

    catch (SqlException ex)
    {
        bResult = false;                   
        if (ex.Errors[0].Class == -10)
        {
            CommonTools.vAddToLog("bInsertNewUser", "ManageUsers", ex.Message);
            if ((savePoint != null))
                savePoint.Rollback();
        }
    } 
    

    【讨论】:

      【解决方案3】:

      使用 11-16 之间的错误代码,或仅使用 16 表示“一般”情况。

      RAISERROR('Already exists',16,1)
      

      为什么?这是我对https://docs.microsoft.com/en-us/sql/relational-databases/errors-events/database-engine-error-severities?view=sql-server-2017的总结:

      SQL RAISERROR -> C#:

      • 0-10 = 仅供参考*
      • 11-16 = 你可以修复它**
      • 17-19 = 获得管理员帮助
      • 20-24 = 一定要获得管理员帮助***

      *(不要扔东西)┬──┬

      **(16 = 一般)

      ***(致命错误)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-23
        • 2010-10-07
        • 2012-09-18
        • 2012-01-16
        相关资源
        最近更新 更多