Asp.net “无法在对象中插入重复的键行”与“违反唯一键约束”之间的区别

Asp.net “无法在对象中插入重复的键行”与“违反唯一键约束”之间的区别,asp.net,sql-server,sql-server-2008,Asp.net,Sql Server,Sql Server 2008,当我们违反唯一键约束“XXXXXXX”时,与无法在具有唯一索引“XXXXXXX”的对象“dbo.XXXXXX”中插入重复键行时,是否存在相同的sql异常。 在我的服务器端代码中,我们使用以下方法处理此问题: catch (SqlException sqlEx) { if (sqlEx.Message.Contains("Violation of UNIQUE KEY constraint 'XXXXX'")) { ..... } } 但现在sql server并没有提示违反

当我们违反唯一键约束“XXXXXXX”时,与无法在具有唯一索引“XXXXXXX”的对象“dbo.XXXXXX”中插入重复键行时,是否存在相同的sql异常。 在我的服务器端代码中,我们使用以下方法处理此问题:

catch (SqlException sqlEx)
{
  if (sqlEx.Message.Contains("Violation of UNIQUE KEY constraint 'XXXXX'"))
  {
    .....
  }
}
但现在sql server并没有提示违反唯一键约束“XXXXX”的错误,而是说不能在具有唯一索引“XXXXXX”的对象“dbo.XXXX”中插入重复的键行


在MSSQL的配置中,有没有一种方法可以让我获得一个描述性sql异常,并返回唯一键约束的文本冲突?

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

无论如何,我不会用错误消息来表示您有什么错误。相反,我将检查错误号,该错误号在SqlException类中作为名为-shopping-的int属性公开

您可以通过查询sys.messages获得所有错误消息及其相关编号的列表。 我使用文本上的like谓词来获取您的问题的相关错误:

选择消息标识[文本] 从sys.messages 其中,像“%Text”这样的[Text]无法插入重复的键%' 它返回:

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的dupe建议,我找到了的链接,但是查询数据库比加载页面要快

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

//无法插入重复的密钥…,违反了唯一密钥。。。 如果新的int[]{26012627}.包含Sqlex.Number { .... }
第一个错误发生在尝试插入违反表上唯一约束的行时。 第二个错误发生在行违反唯一索引时。 这是一个微妙的区别,坦率地说,我真的不知道为什么会有两种不同的错误,特别是考虑到在SQL Server中使用唯一索引实现了唯一约束

无论如何,我不会用错误消息来表示您有什么错误。相反,我将检查错误号,该错误号在SqlException类中作为名为-shopping-的int属性公开

您可以通过查询sys.messages获得所有错误消息及其相关编号的列表。 我使用文本上的like谓词来获取您的问题的相关错误:

选择消息标识[文本] 从sys.messages 其中,像“%Text”这样的[Text]无法插入重复的键%' 它返回:

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的dupe建议,我找到了的链接,但是查询数据库比加载页面要快

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

//无法插入重复的密钥…,违反了唯一密钥。。。 如果新的int[]{26012627}.包含Sqlex.Number { .... }
是-逻辑上是同一个问题。否-没有任何开关会强制引擎在两种相似但不完全相同的情况下返回相同的消息。@请详细说明SMor但不完全相同的情况,好吗?它所抱怨的对象。。。是唯一约束还是唯一索引?唯一约束@SalmanAYes可能重复-逻辑上是相同的问题。否-没有任何开关会强制引擎在两种相似但不完全相同的情况下返回相同的消息。@请详细说明SMor但不完全相同的情况,好吗?它所抱怨的对象。。。它是唯一约束还是唯一索引?唯一约束@SalmanA可能重复