我想捕获 SQL 异常并区分主键违规和唯一键违规。这两种类型的异常返回相同的 ErrorCode 2627。
try
{
}
catch (SqlException ex)
{
if (ex.Number == 2627)
{
throw new UniqueOrDuplicateKeyException("Unique key or Primary key duplication")
}
}
很好,但我想抛出 UniqueKeyException 或 PrimaryKeyException。我知道识别抛出哪个异常的可能性,但它正在解析以“违反唯一键约束”或“违反 PRIMART 键约束”开头的错误消息。当然,我想避免这个选项。
另一种可能性是直接在我的存储过程中执行它,但我有很多存储过程,到处添加它可能会很烦人。
你知道如何以优雅的方式处理这个问题吗?
最佳答案
除了错误消息字符串,我看不出有什么区别方法,即:
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 违规。
关于c# - 主键与唯一键冲突异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27819780/