我在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#中捕获引发的错误?
答案 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)
SQL RAISERROR-> C#:
*(不要扔任何东西)┬──┬
**(16 =常规)
***(严重错误)