Разница между «Невозможно вставить строку повторяющегося ключа в объект» и «Нарушение ограничения UNIQUE KEY» - PullRequest
0 голосов
/ 19 сентября 2019

Это то же исключение sql, когда мы получаем "Нарушение ограничения UNIQUE KEY 'XXXXXXX'" vs "Невозможно вставить строку повторяющегося ключа в объект 'dbo.XXXXXX' с уникальным индексом 'XXXXXXX' '.В моем серверном коде мы обрабатывали это следующим образом:

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

Но теперь сервер sql не выдает ошибку «Нарушение ограничения UNIQUE KEY« XXXXX »», а просто говорит «Невозможно вставитьдубликат ключевой строки в объекте 'dbo.XXXX' с уникальным индексом 'XXXXXX'. "

Есть ли способ в конфигурации MSSQL, что я получаю описательное исключение sql и получаю текст" Нарушение ограничения UNIQUE KEY ""назад?

1 Ответ

2 голосов
/ 19 сентября 2019

Первая ошибка возникает при попытке вставить строку, которая нарушает ограничение уникальности для таблицы.
Вторая ошибка возникает, когда строка нарушает индекс уникальности.Это небольшая разница, и, честно говоря, я действительно не знаю, почему для этого есть две разные ошибки, особенно учитывая, что в SQL Server реализовано уникальное ограничение с использованием уникального индекса.

В любом случае, я бы не сталиспользуйте сообщение об ошибке в качестве указания на то, какая у вас ошибка.Вместо этого я бы проверил номер ошибки, представленный в классе SqlException, как свойство 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.

(И благодаря предложению Ларну о обмане, янашел ссылку для Ошибки ядра СУБД , но запрос к базе данных быстрее, чем загрузка этой страницы ...)

Итак, измените ваш код c # в блоке catch на

// Cannot insert duplicate key..., Violation of UNIQUE KEY...
if (new int[] {2601, 2627}.Contains(sqlEx.Number))
{
  ....
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...