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