我的存储过程正在抛出自定义错误,以处理多用户Web应用程序中的验证。这在SQL Server中按预期方式工作,返回了错误号50001,但是当我的C#代码捕获错误时,错误号始终是50000而不是50001,因此我不能以不同的方式对待错误。
如何捕获错误号50001?请注意,我正在使用Dapper执行所有存储过程。
SQL
THROW 50001, 'Client already has an Active Visit! THIS IS DEV!!!!',1;
Msg 50001, Level 16, State 1, Line 1
Client already has an Active Visit! THIS IS DEV!!!!
C#
catch (SqlException ex)
{
var errorHandler = new ErrorHandler();
var msg = errorHandler.ErrorMessage(ex);
if (ex.Number == 50001)
{
return BadRequest(msg);
}
else
{
return StatusCode(500, msg);
}
}
catch (Exception ex)
{
var errorHandler = new ErrorHandler();
return StatusCode(500, errorHandler.ErrorMessage(ex));
}
答案 0 :(得分:0)
SQL Server错误50000是为一般用户定义的消息保留的,因此听起来好像在sys.messages
中找不到错误50001。您可以尝试使用存储过程sp_addmessage
添加错误。
完成后,您可以这样称呼它:
RAISERROR(50001, 1, 1)
另一个可能是错误50000的原因是,如果您在SQL TRY / CATCH中引发SQL错误,因为它将始终返回50000错误代码。
我自己尝试过此代码:
using (var cmd = new SqlCommand("THROW 50001,'error',1;", conn))
{
cmd.ExecuteNonQuery();
}
这确实返回了ex.Number 50001,所以在您的SQL中一定是一个问题。就像我在上面说的那样,可能是由于TRY / CATCH引起的,因为这不会保存原始错误代码号。