在C#中捕获SQL引发错误

Rae*_*leh 23 c# sql-server raiserror

我在SQL过程中生成raise错误:

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();
    }
} 
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*eve 52

严重性值小于或等于10的RAISERROR未在C#端捕获,因为我认为它们仅被视为警告,您可以从数据库引擎错误严重性的列表中看到

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

RAISERROR('Already exist',16,1)
Run Code Online (Sandbox Code Playgroud)

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


Ode*_*ded 8

你的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();
    }
} 
Run Code Online (Sandbox Code Playgroud)