主键与唯一键冲突异常处理



我想捕获SQL异常,并在主键冲突和唯一键冲突之间有所不同。这两种类型的例外项返回相同的错误代码 2627。

try
{
}
catch (SqlException ex)
{
    if (ex.Number == 2627)
    {
        throw new UniqueOrDuplicateKeyException("Unique key or Primary key duplication")
    }
}

这很好,但我想抛出UniqueKeyException或PrimaryKeyException。我知道识别要抛出哪个异常的可能性,但它正在解析以"违反 UNIQUE KEY 约束"或"违反 PRIMART KEY 约束"开头的错误消息。当然,我想避免这个选项。

另一种可能性是直接在我的存储过程中执行此操作,但我有很多存储过程,在任何地方添加它可能会很烦人。

您知道如何以优雅的方式处理此问题的一些可能性吗?

除了

错误消息字符串之外,我看不到其他区分方法,即:

PK 违规:

Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__Foo'. Cannot insert duplicate key in object 'dbo.Foo'.

唯一约束冲突

Msg 2627, Level 14, State 1, Line 1
Violation of UNIQUE KEY constraint 'U_Foo'. Cannot insert duplicate key in object 'dbo.Foo'.

如果您可以控制这样做,您可以考虑将唯一约束更改为唯一索引?

如果是这样,则可以在 2601 之间检测唯一索引冲突,在 2627 之间检测 PK 冲突。

不知道为什么我不能将其作为答案发布,但要求我将其作为评论发布。这在以前已经回答过了。你可以在这里得到你的答案。

简而言之,您可以使用以下黑客:

if (ex.Message.Contains("Unique")) // It is an unique key violation.

最新更新