“无法在对象中插入重复的键行”与“违反UNIQUE KEY约束”之间的区别

时间:2019-09-19 10:06:57

标签: asp.net sql-server sql-server-2008

当我们收到“违反UNIQUE KEY约束'XXXXXXX'”和“无法在具有唯一索引'XXXXXXX'的对象'dbo.XXXXXX'中插入重复的键行”时,是否是同一SQL异常? 在我的服务器端代码中,我们使用如下代码来处理此问题:

catch (SqlException sqlEx)
{
  if (sqlEx.Message.Contains("Violation of UNIQUE KEY constraint 'XXXXX'"))
  {
    .....
  }
}

但是现在sql server不再提示错误“违反UNIQUE KEY约束'XXXXX'”,而是说“无法在对象'dbo.XXXX'中插入具有唯一索引'XXXXXX'的重复键行。” < / p>

在MSSQL的配置中,是否有一种方法可以获取描述性的sql异常,并获得文本“违反UNIQUE KEY约束”?

1 个答案:

答案 0 :(得分:2)

当您尝试插入违反表上唯一约束的行时,会发生第一个错误。
当该行违反唯一索引时,发生第二个错误。 这是一个微妙的区别,坦率地说,我真的不知道为什么会有两个不同的错误,特别是考虑到在SQL Server中使用唯一索引实现了唯一约束。

无论如何,我不会使用错误消息来指示您遇到了什么错误。取而代之的是,我将检查错误号,该错误号在SqlException类中显示为名为-Surprise Surprise-Number的int属性。

通过查询sys.messages,可以获得所有错误消息及其相关编号的列表。 我使用类似谓词的文本来完成此操作,以获取与您的问题有关的错误:

SELECT message_id, [Text]
FROM sys.messages 
WHERE [Text] LIKE '%Cannot insert duplicate key%'

返回哪个:

message_id  Text
2601        Cannot insert duplicate key row in object '%.*ls' with unique index '%.*ls'. The duplicate key value is %ls.
2627        Violation of %ls constraint '%.*ls'. Cannot insert duplicate key in object '%.*ls'. The duplicate key value is %ls.

(并且由于Larnu的重复建议,我找到了Database Engine Errors的链接,但是查询数据库比加载该页面要快...)

因此,将catch块中的c#代码更改为

// Cannot insert duplicate key..., Violation of UNIQUE KEY...
if (new int[] {2601, 2627}.Contains(sqlEx.Number))
{
  ....
}