在插入期间捕获c#中sql唯一约束违规的最佳方法

时间:2014-07-14 15:40:28

标签: c# sql-server ado.net

我在c#中有一个插入表中的循环。很基本的东西。是否存在一些内容,当违反唯一约束时抛出异常对象,我可以使用它来查看有问题的值是什么?

或者有没有办法在sql中返回它?我有一系列文件,其数据加载到表格中,我正在试图找到这个骗局。

我知道我可以把一些纯粹基于IO的东西拼凑在可以找到它的代码中,但是我想要一些我可以用作更永久解决方案的东西。

4 个答案:

答案 0 :(得分:20)

您正在寻找的是SqlException,特别是违反主键约束。通过查看抛出的异常的number属性,可以从此异常中获取此特定错误。这个答案可能与您的需求相关: How to Identify the primary key duplication from a SQL Server 2008 error code?

总之,它看起来像这样:

// put this block in your loop
try
{
   // do your insert
}
catch(SqlException ex)
{
   // the exception alone won't tell you why it failed...
   if(ex.Number == 2627) // <-- but this will
   {
      //Violation of primary key. Handle Exception
   }
}

编辑:

这可能有点hacky,但您也可以只检查异常的消息组件。像这样:

if (ex.Message.Contains("UniqueConstraint")) // do stuff

答案 1 :(得分:2)

您可以将插入包装到存储过程中,该存储过程在插入之前首先验证没有重复项。这样,您可以精确控制重复值时返回的内容。

此外,您可能会发现将插入逻辑转换为SP将允许您执行您似乎正在执行的批量插入,而无需重复调用数据库。

要回答您的实际问题:

Unique Key Violation in SQL Server - Is it safe to assume Error 2627?

答案 2 :(得分:2)

除了Bill Sambrone的答案,

两个错误代码用于检查唯一键冲突

  1. 2601 - Violation in unique index
  2. 2627 - Violation in unique constraint (although it is implemented using unique index)

您可以根据需要使用一种或两种:

try
{

}
catch(SqlException ex)
{
   if(ex.Number == 2601) 
   {
      // Violation in unique index
   }
   else if(ex.Number == 2627)
   {
      // Violation in unique constraint
   }
}

OR

try
{

}
catch(SqlException ex)
{
   if(ex.Number == 2601 || ex.Number == 2627)
   {
      // Violation in one on both...
   }
}

答案 3 :(得分:0)

你也可以这样做:

var result = DbCon.CheckForPrimaryKey(value).ToList();
if(result.Count() == 0)
       DbCon.InsertValue(value);
else
     // Do Nothing