c# - 主键与唯一键冲突异常处理

标签 c# sql exception

我想捕获 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/

相关文章:

mysql - 查询从多个表中选择 MySQL

sql - 当 SQL Developer 空闲时,我失去了连接

sql - 甲骨文 SQL : efficient way to calculate business days in a month

java - 如何只处理 ClientAbortException?

android - 在 Android SQLite 中从哪里获取数据库错误信息(例如,由于违反 not null 而导致插入失败)

c# - 读取 XSD 为 "anyType"且属性 xsi 为 :type ="string" 的 XML 元素

javascript - 如何将 JavaScript 事件处理程序添加到 ASP 控件上动态生成的文本框

c# - Linq - SingleOrDefault 和 NerdDinner

java - 在catch block 中处理异常?

c# - 委托(delegate)签名/通用委托(delegate)?