Лучший способ уловить уникальные нарушения ограничений sql в С# во время вставок

У меня есть цикл в С#, который вставляется в таблицу. довольно простой материал. Есть ли что-то insdie объекта исключения, который генерируется при нарушении уникального ограничения, который я могу использовать, чтобы узнать, что это за нарушение?

Или есть способ вернуть его в sql? У меня есть серия файлов, данные которых загружаются в таблицы, и я обнимаю голову, пытаясь найти обман.

Я знаю, что я мог бы соединить что-то чисто основанное на IO в коде, которое может найти его, но я хотел бы использовать что-то, что я мог бы использовать в качестве более постоянного решения.

Ответ 1

То, что вы ищете, это исключение SqlException, в частности нарушение ограничений первичного ключа. Вы можете получить эту конкретную ошибку из этого исключения, посмотрев на свойство number генерируемого исключения. Этот ответ, вероятно, имеет отношение к тому, что вам нужно: Как идентифицировать дублирование первичного ключа с кодом ошибки SQL Server 2008?

В целом, это выглядит так:

// 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
   }
}

EDIT:

Это может быть немного взломанным, но вы также можете просто проверить компонент сообщения об исключении. Что-то вроде этого:

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

Ответ 2

Вы можете обернуть вставку в хранимую процедуру, которая сначала подтвердила, что перед вставкой не было дубликатов. Таким образом, вы можете точно контролировать, что возвращается, когда значение дублируется.

Кроме того, вы можете обнаружить, что перенос логики вставки в SP позволит вам делать объемную вставку, которую вы, кажется, выполняете, не повторяя повторные вызовы БД.

Для ответа на ваш вопрос:

Уникальное нарушение ключа в SQL Server - Можно ли предположить ошибку 2627?

Ответ 3

Вы можете сделать это так же:

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