当我们收到“违反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约束”?
答案 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))
{
....
}