在C#中捕获SQL引发错误

时间:2014-03-02 11:13:55

标签: c# sql-server raiserror

我在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#中捕获引发的错误?

3 个答案:

答案 0 :(得分:51)

严重性值小于或等于10的RAISERROR不会被C#端捕获,因为我认为它们只被视为警告,因为您可以从 在Database Engine Error Severity

列出

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

RAISERROR('Already exist',16,1)

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

答案 1 :(得分:6)

你的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();
    }
} 

答案 2 :(得分:0)

在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 = fyi *
  • 11-16 =您可以修复它**
  • 17-19 =获得管理员帮助
  • 20-24 =肯定会获得管理员帮助***

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

**(16 =常规)

***(严重错误)