我想捕获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约束”开头的错误消息。当然,我想避免这个选择。
另一种可能性是直接在我的存储过程中进行,但是我有很多存储过程,并且在任何地方添加它都会非常烦人。
您是否了解如何以优雅的方式处理此问题?
答案 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.