【问题标题】:Primary vs Unique key violation exception handling主键与唯一键违规异常处理
【发布时间】:2015-03-05 08:48:06
【问题描述】:

我想捕捉 SQL 异常并区分主键违规和唯一键违规。这两种类型的异常返回相同的ErrorCode 2627。

try
{

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

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

另一种可能性是直接在我的存储过程中进行,但我有很多存储过程,到处添加它会很烦人。

您知道如何以优雅的方式处理此问题吗?

【问题讨论】:

    标签: c# sql exception


    【解决方案1】:

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

    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'.
    

    如果您可以控制这样做,您可以考虑将changing the Unique Constraint 设置为唯一索引吗?

    如果是这样,您可以在 2601 和 2627 之间检测到唯一索引违规和 2627 之间的 PK 违规。

    【讨论】:

    • 顺便说一句,我可以想象我遇到的几乎每个 DBA 在解释为什么 UKC 突然变成 UI 的理由时的表情。 ..
    • 我不认为处理异常是更改所有表中索引约束的充分理由。
    【解决方案2】:

    不知道为什么我无法将其发布为答案,但要求我将其发布为评论。这个之前已经回答过了。你可以得到你的答案here

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

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

    【讨论】:

    • 谢谢,但正如我所写,我想避免这种解决方案。
    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 2019-03-08
    • 2022-06-13
    • 2015-11-05
    • 2019-04-29
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多