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

时间:2015-01-07 12:42:30

标签: c# sql exception

我想捕获SQL异常,并且主键冲突和唯一键冲突之间存在差异。这两种类型的exceptinons返回相同的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约束”开头的错误消息。当然,我想避免这个选择。

另一种可能性是直接在我的存储过程中进行,但是我有很多存储过程,并且在任何地方添加它都会非常烦人。

您是否了解如何以优雅的方式处理此问题?

2 个答案:

答案 0 :(得分:3)

除了错误消息字符串之外,我无法区分其他方式,即:

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之间检测PK违规。

答案 1 :(得分:1)

不知道为什么我无法将此作为答案发布,但要求我将此作为评论发布。这已经得到了回答。您可以得到答案here

简而言之,您可以使用下面的黑客攻击:

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