如何使用Dapper获取用户定义的SQLException号

时间:2018-07-25 13:02:08

标签: c# sql-server dapper

我的存储过程正在抛出自定义错误,以处理多用户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));
}

示例 example

1 个答案:

答案 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引起的,因为这不会保存原始错误代码号。