Перехват исключений уникальных ключей SQL в .NET - PullRequest
12 голосов
/ 10 марта 2009

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

Ответы [ 4 ]

24 голосов
/ 10 марта 2009

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

SqlError имеет среди прочего такие свойства, как "Class" и "Number" - нарушения уникального ключа: class = 14 и number = 2601. Проверьте эти числа, чтобы точно найти вашу ошибку.

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

Сообщение 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 голосов
/ 10 марта 2009

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

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

2 голосов
/ 10 марта 2009

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

1 голос
/ 10 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...