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