SQL Server中的唯一键冲突-假定错误2627是否安全?


72

我需要UNIQUE通过正在开发的C#应用​​程序以特殊方式捕获违反约束的情况。可以肯定地说,这Error 2627将始终与此类违规相对应,以便我可以使用

if (ThisSqlException.Number == 2627)
{
    // Handle unique constraint violation.
}
else
{
    // Handle the remaing errors.
}

Answers:


126

2627是唯一约束(包括主键),2601是唯一索引

SELECT * FROM sys.messages
WHERE text like '%duplicate%' and text like '%key%' and language_id = 1033

1
@gbn唯一约束和唯一索引有什么区别?都不都执行索引吗?
Zameer Ansari

1
technet.microsoft.com/zh-cn/library/aa224827(v=sql.80).aspx-总而言之,我们可以安全地得出结论,唯一约束和唯一索引之间没有实际区别,唯一的事实是唯一约束在数据库中也被列为约束对象。
bfhd

@bfhd用于SQL Server2000。很老。键和常量的区别包括INCLUDE和WHERE子句。我从不使用过于僵化的约束条件
-gbn

18

这是我编写的便捷扩展方法,用于发现这些缺陷:

    public static bool IsUniqueKeyViolation(this SqlException ex)
    {
        return ex.Errors.Cast<SqlError>().Any(e => e.Class == 14 && (e.Number == 2601 || e.Number == 2627 ));
    }

课堂检查真的必要吗?如果需要,为什么?
Tuukka Haapaniemi

4

在近似范围内,可以。

如果您在MS错误和事件站点中搜索SQL Server错误2627,则您应该希望到达此页面1,这表明消息将始终涉及重复的键冲突(请注意哪些部分已参数化,哪些没有参数化):

Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'.

1与@ 2020-06-18一样,数据库引擎错误和事件将是转到的正确页面


您所说的“近似值”是什么意思?
用户

@User-我的意思是,我想不出会抱怨重复键的任何其他东西,但是不幸的是,该消息是根据约束类型进行参数化的。
Damien_The_Unbeliever 2011年

@Damien_The_Unbeliever,指向[此页]的链接指向Microsoft Docs的内容。是故意的吗?
ASh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.