Подтвердить что ты не робот

Исключение исключений SQL-ключей SQL в .NET.

Мне было интересно, если бы у кого-то был более элегантный способ проверить уникальные исключения ключа из SQL в .NET, отличные от разбора сообщения об ошибке? Прямо сейчас я вызываю sproc в SQL, а затем использую блок catch try в .NET. В блоке try catch я разбираю сообщение об ошибке, и это уникальная ключевая ошибка. Я бросаю экземпляр пользовательской ошибки вызывающему классу, если я просто не выкидываю исходное исключение из вызывающего класса. Это кажется мне ужасно неэффективным.

4b9b3361

Ответ 1

Если вы поймаете SqlException, вы сможете перечислить коллекцию "Ошибки", содержащую несколько объектов "SqlError".

В SqlError есть, помимо прочего, такие свойства, как "Класс" и "Число" - уникальные нарушения ключа - это класс = 14 и число = 2601. Проверьте, чтобы эти числа точно находили вашу ошибку.

Те же коды ошибок, которые вы получаете при попытке выполнить запрос в SQL Management Studio:

Msg 2601, уровень 14, состояние 1, строка 1
Невозможно вставить повторяющуюся строку ключа в объект..........
Заявление завершено.

"Msg" переводится в свойство "Number" на SqlError, "Level" - "Class".

try
{
  _cmd.ExecuteNonQuery();
}
catch(SqlException sqlExc)
{
   foreach (SqlError error in sqlExc.Errors)
   {
      string msg = string.Format("{0}: {1}", error.Number, error.Message);
   }
}

Таким образом, вы можете легко и ТОЧНО идентифицировать ошибку "уникального ограничения, нарушенного".

Марк

Ответ 2

Почему бы вам просто не запросить, существует ли уникальный идентификатор? Это лучше, чем получение исключения.

Ответ 3

Сообщение об ошибке Parsing - плохая идея. Например, если вы используете сообщение Ms SQL, можно локализовать (на другом языке), и вы не найдете слова, которое вы ищете.

Если вы используете Ms SQL, вы должны проверить свойство Number.

Ответ 4

Очевидный ответ: попытайтесь извлечь это значение из базы данных, прежде чем вставлять (или обновлять) его и уведомлять пользователя перед вставкой.

Альтернативный ответ: проверьте уникальность внутри SP и верните это как сообщение об ошибке из SP, тогда вам не нужно разбирать какие-либо ошибки. Они все плохие.