在C#中捕获SQL引发错误

我在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(); } } 

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

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

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

 RAISERROR('Already exist',16,1) 

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

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