捕获数据库约束错误的最佳方法

ama*_*eur 7 c# sql sql-server asp.net

我正在调用一个存储过程,它将数据从c#插入到sql server数据库中.我对表有很多限制,例如唯一列等.目前我有以下代码:

try
{
   // inset data
}
catch (SqlException ex)
{
    if (ex.Message.ToLower().Contains("duplicate key"))
    {

        if (ex.Message.ToLower().Contains("url"))
        {
            return 1;
        }

        if (ex.Message.ToLower().Contains("email"))
        {
            return 2;
        }
    }

    return 3;
}
Run Code Online (Sandbox Code Playgroud)

在C#中插入数据之前检查列是否是唯一的等更好的做法,还是在存储过程中或发生异常并按上述方法处理?我不是上述的粉丝,但在这个领域寻找最佳实践.

mil*_*ose 6

我将数据库约束视为最后的手段.(即,它们应该作为维护数据完整性的备份方式存在于您的模式中.)但是我想您尝试将数据保存在数据库中之前,数据应该真正有效.如果没有其他原因,那么因为提供有关无效输入的反馈是一个UI问题,并且数据有效性错误实际上不应该每次都在整个层堆栈中上下浮动.

此外,您希望对数据的形状进行多种断言,这些断言无法轻松地使用约束表达.(例如,订单的状态转换."订单只能SHIPPED来自PAID"或更复杂的情况.)也就是说,您需要使用涉及基于过程语言的检查,这些检查会复制更多的业务逻辑,以及然后让那些报告某种错误代码,并在您的应用程序中包含更多复杂性,只是为了在模式定义中进行所有数据验证.

验证本身很难放在应用程序中,因为它既涉及UI 与模型架构相关联,但我转向在UI附近进行操作.