Извлечение структурированной информации из SqlException

Допустим, я выполнил инструкцию SQL из приложения C#, которое вызвало SqlException со следующим сообщением об ошибке:

Нарушение ограничения UNIQUE KEY 'MyUniqueConstraint'. Невозможно вставить дубликат ключа в объект "MyTable". Дубликат значения ключа (MyValue).

Я понимаю, что вся строка происходит из базы данных. Я хотел бы извлечь соответствующие части из сообщения - аналогично этому вопросу, но я хочу фактически извлечь данные, такие как MyUniqueConstraint, MyTable а также MyValue, а не только номер ошибки SQL.

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

Можно ли разумно получить такую ​​структурированную информацию из приложения при возникновении ошибки на уровне базы данных (в идеале из исключения)?

2 ответа

Решение

Недавно я столкнулся с подобной проблемой и обнаружил, что даже фильтрация исключений SqlException по их количеству проблематична.

Кроме этого, я еще не сталкивался с решением, которое могло бы получить данные из SqlException. То есть, кроме разбора сообщения. Одной из проблем здесь будет то, что текст сообщения сервера различен для разных языков и версий сервера.

На самом деле я помню, что в основной базе данных mssql есть системная таблица / представление, которое содержит все сообщения об ошибках для разных языков. Вы можете попытаться проанализировать сообщения, основанные на этом, но некоторые SqlExceptions даже не от серверной стороны вещей...

Здесь я хочу сказать хотя бы одну полезную вещь, поэтому:

В пространстве имен System.Data имеется DBConcurrencyException, которая, кажется, в некоторой степени полезна (имеется в виду: в одном случае, который не полностью связан с этим вопросом). У него есть свойство Row (строка, которая вызвала исключение, вы можете использовать его для получения имени таблицы и данных).

Желаемое мышление.

Я понимаю, что вся строка исходит из базы данных

Да, это так. Это строка.

На самом деле разбор сообщения не вариант, так как он подвержен ошибкам

Синтаксический анализ - это единственная опция, так как база данных предоставляет только 2 элемента: номер ошибки sql и строку. Таким образом, либо вы придумываете общий хрустальный шар, либо работаете с тем, что у вас есть, что означает разбор.

Ни одна база данных, о которой я знаю, не предоставляет больше информации, таинственным образом скрытой в исключении, и, если это произойдет, это все равно не будет стандартным подходом к базам данных.

Другие вопросы по тегам