Обработка ошибок и сообщений в приложениях

Ошибки, вызванные либо компонентом SQL Server Database Engine, либо инструкцией RAISERROR, не входят в результирующий набор. Ошибки возвращаются в приложения с помощью механизма обработки ошибок, независимого от обработки результирующего набора.

Интерфейс прикладного программирования (API) каждой базы данных содержит набор функций, интерфейсов, методов, объектов или структур для возврата ошибок и сообщений. Каждая функция или метод API обычно возвращает код состояния, обозначающий успешное завершение операции. Если состояние не соответствует успешному завершению, приложение может вызвать функции, методы или объекты для получения сведений об ошибке.

Компонент Database Engine может возвращать данные участнику одним из двух способов:

  1. Ошибки

    • Ошибки из представления sys.messages со степенью серьезности 11 и выше.

    • Любая инструкция RAISERROR со степенью серьезности 11 и выше.

  2. Сообщения

    • Выходные данные инструкции PRINT.

    • Выходные данные нескольких инструкций DBCC.

    • Ошибки из представления sys.messages со степенью серьезности 10 и ниже.

    • Любая инструкция RAISERROR со степенью серьезности 10 или ниже.

Приложения, использующие такие API, как ActiveX Data Object (ADO) и OLE DB, обычно не различают ошибки и сообщения. В приложениях Open Database Connectivity (ODBC) сообщения формируют код возврата функции SQL_SUCCESS_WITH_INFO, а ошибки обычно формируют код возврата SQL_ERROR. Это различие выражено наиболее явно в DB-библиотеке, где ошибки возвращаются в функцию обработки ошибок, а сообщения возвращаются в функцию обработки сообщений текущего приложения. Подобным образом при использовании поставщика SqlClient ошибки вызывают срабатывание исключения SqlException; сообщения не меняют поток управления и могут быть перехвачены кодом приложения путем регистрации функции обратного вызова для обработчика события InfoMessage.

Другие компоненты также могут вызывать ошибки:

  • OLE DB для поставщика SQL Server и драйверы ODBC SQL Server сами вызывают ошибки. Формат этих ошибок соответствует форматам, определенным в спецификациях API.

  • Net-библиотеки сами вызывают ошибки.

  • API расширенной хранимой процедуры вызывает ошибки в своем собственном формате.

  • В SQL Server мастера, приложения и программы, подобные среде Среда SQL Server Management Studio и программе sqlcmd, могут вызывать собственные ошибки.

Ошибки из этих компонентов возвращаются в вызывающее приложение с помощью того же основного механизма, что и ошибки от компонента Database Engine. Приложение может обработать эти ошибки с помощью той же логики обработки ошибок, которая применяется для ошибок компонента Database Engine. Поскольку эти ошибки вызваны вне компонента Database Engine, они не могут быть обработаны в конструкциях TRY…CATCH языка Transact-SQL. Дополнительные сведения см. в разделе TRY...CATCH (Transact-SQL).

Обработка ошибок ODBC

В спецификацию ODBC введена модель ошибок, которая послужила основой для моделей ошибок API-интерфейсов универсальной базы данных, таких как ADO и OLE DB, и API-интерфейсов, созданных для баз данных классов ODBC-RDO, Data Access Object (DAO) и Microsoft Foundation Classes (MFC). Это относится и к драйверу ODBC собственного клиента SQL Server. В модели ODBC ошибки обладают следующими свойствами:

  • SQLSTATE

    SQLSTATE — это код ошибки, состоящий из пяти символов и определенный в спецификации ODBC. Коды SQLSTATE являются общими во всех драйверах ODBC и позволяют приложениям кодировать обработку основных ошибок без проверки различных кодов ошибок, возвращаемых разными базами данных. ODBC SQLSTATE никак не связан с атрибутом состояния сообщений об ошибках компонента Database Engine.

    ODBC 2.x возвращает один набор кодов SQLSTATE, а ODBC 3.x возвращает набор кодов SQLSTATE, выровненных с помощью Open Group Data Management: Язык SQL (Structured Query Language), версия 2 стандартная. Поскольку все драйверы ODBC возвращают одинаковый набор кодов SQLSTATE, приложения, в которых обработка ошибок основана на кодах SQLSTATE, являются более мобильными.

  • Номер собственной ошибки.

    Номер собственной ошибки — это номер ошибки из основной базы данных. Приложения ODBC получают номера ошибок компонента Database Engine как номера собственных ошибок.

  • Строка сообщения об ошибке.

    Сообщение об ошибке возвращается в параметре строки сообщения об ошибке.

Когда функция ODBC возвращает состояние, отличное от SQL_SUCCESS, приложение может вызвать функцию SQLGetDiagRec для получения сведений об ошибке. Например, если приложение ODBC обнаруживает синтаксическую ошибку (номер ошибки SQL Server — 170), функция SQLGetDiagRec возвращает следующее значение:

szSqlState = 42000, pfNative = 170
szErrorMsg =
'[Microsoft][ODBC SQL Server Driver][SQL Server]
                                     Line 1: Incorrect syntax near *'

Функция ODBC SQLGetDiagField позволяет драйверам ODBC указывать специфические для драйвера диагностические поля в возвращаемых драйвером диагностических записях. Драйвер ODBC SQL Server указывает специфические для драйвера поля для хранения таких данных об ошибках компонента Database Engine, как серьезность компонента Database Engine и коды состояния.

Дополнительные сведения о получении сообщения об ошибках в приложениях ODBC см. в разделе Обработка ошибок и сообщений.

Обработка ошибок ADO

ADO использует объекты ошибок и коллекцию ошибок для возврата стандартных сведений об ошибке, как SQLSTATE, номер внутренней ошибки и строка сообщения об ошибке. Они совпадают с аналогами в ODBC. ADO не поддерживает интерфейсы ошибок, специфические для поставщика; специфические для компонента Database Engine сведения об ошибках, как серьезность или состояние, недоступны в приложениях ADO.

Дополнительные сведения о получении сообщений об ошибках в приложениях ADO см. в разделе Обработка ошибок и сообщений.

Обработка ошибок OLE DB

OLE DB использует интерфейс IErrorInfo для возврата стандартных сведений об ошибках, как SQLSTATE, номер внутренней ошибки и строка ошибки. Они совпадают с аналогами в ODBC. Поставщик OLE DB для SQL Server определяет интерфейс ISQLServerErrorInfo для возврата специфических для компонента Database Engine данных, как серьезность, состояние, название процедуры и номер строки.

Дополнительные сведения о получении сообщений об ошибках в приложениях OLE DB см. в разделе Ошибки.

Обработка ошибок SqlClient

Поставщик, управляемый SqlClient, выдает исключение SqlException, когда компонент SQL Server Database Engine обнаруживает необработанную ошибку. Через класс SqlException приложения могут получать сведения об ошибках, произошедших на сервере, включая номер ошибки, сообщение об ошибке, серьезность ошибки и другие сведения контекста исключения.

Для обработки предупреждений и информационных сообщений, отправляемых компонентом SQL Server Database Engine, приложения могут создавать делегат SqlInfoMessageEventHandler для ожидания события InfoMessage в классе SqlConnection. Как и в случае с исключением, контекстные данные сообщения, как серьезность и состояние, передаются как аргументы функции обратного вызова.