Функция SQLGetDiagField
соответствие
Представлена версия: соответствие стандартам ODBC 3.0: ISO 92
Сводка
SQLGetDiagField возвращает текущее значение поля записи структуры диагностических данных (связанной с указанным дескриптором), содержащей сведения об ошибке, предупреждении и состоянии.
Синтаксис
SQLRETURN SQLGetDiagField(
SQLSMALLINT HandleType,
SQLHANDLE Handle,
SQLSMALLINT RecNumber,
SQLSMALLINT DiagIdentifier,
SQLPOINTER DiagInfoPtr,
SQLSMALLINT BufferLength,
SQLSMALLINT * StringLengthPtr);
Аргументы
HandleType
[Входные данные] Идентификатор типа дескриптора, описывающий тип дескриптора, для которого требуется диагностика. Должно быть одним из следующих элементов:
SQL_HANDLE_DBC
SQL_HANDLE_DBC_INFO_TOKEN
SQL_HANDLE_DESC
SQL_HANDLE_ENV
SQL_HANDLE_STMT
SQL_HANDLE_DBC_INFO_TOKEN дескриптор используется только диспетчером драйверов и драйвером. Приложения не должны использовать этот тип дескриптора. Дополнительные сведения о SQL_HANDLE_DBC_INFO_TOKEN см. в разработке Connection-Pool осведомленности вдрайвера ODBC.
Дескриптор
[Входные данные] Дескриптор структуры диагностических данных типа, указанного HandleType. Если HandleType SQL_HANDLE_ENV, Handle может быть общим или необработаным дескриптором среды.
RecNumber
[Входные данные] Указывает запись состояния, из которой приложение ищет сведения. Записи состояния нумеруются от 1. Если аргумент
DiagIdentifier
[Входные данные] Указывает поле диагностики, значение которого должно быть возвращено. Дополнительные сведения см. в разделе "DiagIdentifier Argument" статьи "Комментарии".
DiagInfoPtr
[Выходные данные] Указатель на буфер, в котором возвращаются диагностические сведения. Тип данных зависит от значения DiagIdentifier. Если DiagInfoPtr является целым типом, приложения должны использовать буфер SQLULEN и инициализировать значение до 0 перед вызовом этой функции, так как некоторые драйверы могут записывать только нижний 32-разрядный или 16-разрядный буфер и оставить бит более высокого порядка неизменным.
Если DiagInfoPtr имеет значение NULL, StringLengthPtr по-прежнему возвращает общее число байтов (за исключением символа завершения null для символьных данных), доступное для возврата в буфер, на который указывает DiagInfoPtr.
BufferLength
[Входные данные] Если DiagIdentifier является диагностикой, определенной ODBC, и DiagInfoPtr указывает на строку символов или двоичный буфер, этот аргумент должен быть длиной *DiagInfoPtr. Если DiagIdentifier является полем, определенным ODBC, и *DiagInfoPtr является целым числом, BufferLength игнорируется. Если значение в *DiagInfoPtr является строкой Юникода (при вызове SQLGetDiagFieldW), аргумент BufferLength должен быть четным.
Если DiagIdentifier является определяемым драйвером полем, приложение указывает характер поля диспетчеру драйверов, задав аргумент BufferLength. BufferLength могут иметь следующие значения:
Если DiagInfoPtr является указателем на символьную строку, BufferLength — это длина строки или SQL_NTS.
Если DiagInfoPtr является указателем на двоичный буфер, приложение помещает результат макроса SQL_LEN_BINARY_ATTR (длины) в BufferLength. Это помещает отрицательное значение в BufferLength.
Если DiagInfoPtr является указателем на значение, отличное от символьной строки или двоичной строки, BufferLength должны иметь значение SQL_IS_POINTER.
Если *DiagInfoPtr содержит тип данных фиксированной длины, BufferLength SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT или SQL_IS_USMALLINT.
StringLengthPtr
[Выходные данные] Указатель на буфер, в котором возвращается общее число байтов (за исключением количества байтов, необходимых для символа завершения null), доступного для возврата в *DiagInfoPtrдля символьных данных. Если число байтов, доступных для возврата, больше или равно BufferLength, текст в *DiagInfoPtr усечен до BufferLength минус длина символа завершения null.
Возвращает
SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, SQL_INVALID_HANDLE или SQL_NO_DATA.
Диагностика
SQLGetDiagField не публикует диагностические записи для себя. В нем используются следующие возвращаемые значения, чтобы сообщить о результатах собственного выполнения:
SQL_SUCCESS: функция успешно вернула диагностические сведения.
SQL_SUCCESS_WITH_INFO: *DiagInfoPtr слишком мало для хранения запрошенного поля диагностики. Поэтому данные в поле диагностики усечены. Чтобы определить, что произошло усечение, приложение должно сравнить BufferLength с фактическим числом доступных байтов, которое записывается в *StringLengthPtr.
SQL_INVALID_HANDLE: дескриптор, указанный HandleType
и Handle , не является допустимым дескриптором.SQL_ERROR: произошло одно из следующих действий:
аргумент DiagIdentifier не был одним из допустимых значений.
аргумент DiagIdentifier был SQL_DIAG_CURSOR_ROW_COUNT, SQL_DIAG_DYNAMIC_FUNCTION, SQL_DIAG_DYNAMIC_FUNCTION_CODE или SQL_DIAG_ROW_COUNT, но Handle не был дескриптором инструкции. (Диспетчер драйверов возвращает эту диагностику.)
аргумент RecNumber был отрицательным или 0, если DiagIdentifier указал поле из диагностической записи. RecNumber игнорируется для полей заголовка.
Запрошенное значение было строкой символов и BufferLength было меньше нуля.
При использовании асинхронного уведомления асинхронная операция в дескрипторе не завершена.
SQL_NO_DATA: RecNumber было больше количества диагностических записей, которые существовали для дескриптора, указанного в Handle. Функция также возвращает SQL_NO_DATA для любых положительных RecNumber, если нет диагностических записей для Handle.
Комментарии
Приложение обычно вызывает SQLGetDiagField для выполнения одной из трех целей:
Получение определенных сведений об ошибке или предупреждении при возврате вызова функции SQL_ERROR или SQL_SUCCESS_WITH_INFO (или SQL_NEED_DATA для функции SQLBrowseConnect).
Чтобы определить количество строк в источнике данных, затронутых при выполнении операций вставки, удаления или обновления, с вызовом SQLExecute, SQLExecDirect, SQLBulkOperationsили SQLSetPos (из поля заголовка SQL_DIAG_ROW_COUNT) или определить количество строк, существующих в текущем открытом курсоре, Значение , если драйвер может предоставить эти сведения (из поля заголовка SQL_DIAG_CURSOR_ROW_COUNT).
Чтобы определить, какая функция была выполнена вызовом SQLExecDirect или SQLExecute (из полей заголовка SQL_DIAG_DYNAMIC_FUNCTION и SQL_DIAG_DYNAMIC_FUNCTION_CODE).
Любая функция ODBC может публиковать ноль или больше диагностических записей при каждом вызове, поэтому приложение может вызывать SQLGetDiagField после любого вызова функции ODBC. Количество диагностических записей, которые можно хранить в любое время, не ограничено. SQLGetDiagField извлекает только последние диагностические сведения, связанные со структурой диагностических данных, указанно й в аргументе Handle. Если приложение вызывает функцию ODBC, отличной от SQLGetDiagField или SQLGetDiagRec, все диагностические сведения из предыдущего вызова с тем же дескриптором теряются.
Приложение может сканировать все диагностические записи, добавив RecNumber, если SQLGetDiagField возвращает SQL_SUCCESS. Число записей состояния указывается в поле заголовка SQL_DIAG_NUMBER. Вызовы SQLGetDiagField являются недеструктными для полей заголовка и записи. Приложение может вызывать SQLGetDiagField позже, чтобы получить поле из записи, если функция, отличной от диагностических функций, не была вызвана в промежуточном периоде, которая будет публиковать записи в том же дескрипторе.
Приложение может вызывать SQLGetDiagField для возврата любого диагностического поля в любое время, за исключением SQL_DIAG_CURSOR_ROW_COUNT или SQL_DIAG_ROW_COUNT, которое вернет SQL_ERROR, если Handle не является дескриптором инструкции. Если любое другое поле диагностики не определено, вызов SQLGetDiagField вернет SQL_SUCCESS (если не обнаружена другая диагностика), а для поля возвращается неопределенное значение.
Дополнительные сведения см. в разделе Использование SQLGetDiagRec и SQLGetDiagField и реализации SQLGetDiagRec и SQLGetDiagField.
Вызов API, отличный от выполняемого асинхронно, приведет к возникновению ошибки последовательности функций HY010. Однако запись об ошибке не может быть получена до завершения асинхронной операции.
Аргумент HandleType
Каждый тип дескриптора может иметь диагностические сведения, связанные с ним. Аргумент HandleType указывает тип дескриптора Handle.
Некоторые поля заголовков и записей нельзя возвращать для дескрипторов среды, подключения, инструкции и дескриптора. Эти дескриптора, для которых поле неприменимо, указываются в разделах "Поля заголовка" и "Поля записи" ниже.
Если HandleType SQL_HANDLE_ENV, Handle может быть либо общим, либо необработаным дескриптором среды.
Поля диагностики заголовков для конкретного драйвера не должны быть связаны с дескриптором среды.
Единственными полями заголовка диагностики, определенными для дескриптора, являются SQL_DIAG_NUMBER и SQL_DIAG_RETURNCODE.
Аргумент DiagIdentifier
Этот аргумент указывает идентификатор поля, необходимого для структуры диагностических данных. Если recNumber больше или равно 1, данные в поле описывают диагностические сведения, возвращаемые функцией. Если значение recNumber равно 0, поле находится в заголовке структуры диагностических данных и, следовательно, содержит данные, относящиеся к вызову функции, возвращающим диагностические сведения, а не к определенной информации.
Драйверы могут определять поля заголовков и записей для конкретного драйвера в структуре диагностических данных.
Приложение ODBC 3*.x*, работающее с драйвером ODBC 2*.x*, сможет вызывать SQLGetDiagField только с аргументом DiagIdentifier SQL_DIAG_CLASS_ORIGIN, SQL_DIAG_CLASS_SUBCLASS_ORIGIN, SQL_DIAG_CONNECTION_NAME, SQL_DIAG_MESSAGE_TEXT, SQL_DIAG_NATIVE, SQL_DIAG_NUMBER, SQL_DIAG_RETURNCODE, SQL_DIAG_SERVER_NAME, или SQL_DIAG_SQLSTATE. Все остальные поля диагностики возвращают SQL_ERROR.
Поля заголовка
Поля заголовка, перечисленные в следующей таблице, можно включить в аргумент DiagIdentifier.
DiagIdentifier | Тип возвращаемого значения | Возвращает |
---|---|---|
SQL_DIAG_CURSOR_ROW_COUNT | SQLLEN | Это поле содержит количество строк в курсоре. Его семантика зависит от типов сведений SQLGetInfo SQL_DYNAMIC_CURSOR_ATTRIBUTES2, SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2, SQL_KEYSET_CURSOR_ATTRIBUTES2 и SQL_STATIC_CURSOR_ATTRIBUTES2, указывающих, какие числа строк доступны для каждого типа курсора (в SQL_CA2_CRC_EXACT и SQL_CA2_CRC_APPROXIMATE битах). Содержимое этого поля определяется только для дескрипторов инструкций и только после вызова SQLExecute, SQLExecDirectили SQLMoreResults. Вызов SQLGetDiagField с DiagIdentifier SQL_DIAG_CURSOR_ROW_COUNT, кроме дескриптора инструкций, вернет SQL_ERROR. |
SQL_DIAG_DYNAMIC_FUNCTION | SQLCHAR * | Это строка, описывающая инструкцию SQL, выполняемую базовой функцией. (Дополнительные сведения см. в разделе "Значения полей динамической функции" далее в этом разделе. Содержимое этого поля определяется только для дескрипторов инструкций и только после вызова SQLExecute, SQLExecDirectили SQLMoreResults. Вызов SQLGetDiagField с DiagIdentifier SQL_DIAG_DYNAMIC_FUNCTION, отличной от дескриптора инструкций, вернет SQL_ERROR. Значение этого поля не определено перед вызовом SQLExecute или SQLExecDirect. |
SQL_DIAG_DYNAMIC_FUNCTION_CODE | SQLINTEGER | Это числовой код, описывающий инструкцию SQL, которая была выполнена базовой функцией. (Дополнительные сведения см. в разделе "Значения полей динамической функции", далее в этом разделе. Содержимое этого поля определяется только для дескрипторов инструкций и только после вызова SQLExecute, SQLExecDirectили SQLMoreResults. Вызов SQLGetDiagField с DiagIdentifier SQL_DIAG_DYNAMIC_FUNCTION_CODE, отличной от дескриптора инструкции, вернет SQL_ERROR. Значение этого поля не определено перед вызовом SQLExecute или SQLExecDirect. |
SQL_DIAG_NUMBER | SQLINTEGER | Количество записей состояния, доступных для указанного дескриптора. |
SQL_DIAG_RETURNCODE | SQLRETURN | Возвращает код, возвращаемый функцией. Список кодов возврата см. в разделе Коды возврата. Драйверу не нужно реализовать SQL_DIAG_RETURNCODE; он всегда реализуется диспетчером драйверов. Если функция еще не была вызванадескриптора |
SQL_DIAG_ROW_COUNT | SQLLEN | Количество строк, затронутых вставкой, удалением или обновлением, выполняемым SQLExecute, SQLExecDirect, SQLBulkOperationsили SQLSetPos. Он определяется драйвером после выполнения спецификации курсора |
Поля записи
Поля записи, перечисленные в следующей таблице, можно включить в аргумент DiagIdentifier.
DiagIdentifier | Тип возвращаемого значения | Возвращает |
---|---|---|
SQL_DIAG_CLASS_ORIGIN | SQLCHAR * | Строка, указывающая документ, определяющий часть класса значения SQLSTATE в этой записи. Его значение равно ISO 9075 для всех SQLSTATEs, определенных интерфейсом open Group и ISO call-level. Для SQLSTATEs, зависящих от ODBC (все те, чьи класс SQLSTATE имеет значение "IM"), его значение равно ODBC 3.0. |
SQL_DIAG_COLUMN_NUMBER | SQLINTEGER | Если поле SQL_DIAG_ROW_NUMBER является допустимым номером строки в наборе строк или набором параметров, это поле содержит значение, представляющее номер столбца в результирующем наборе или номер параметра в наборе параметров. Число столбцов результирующих наборов всегда начинается с 1; Если эта запись состояния относится к столбцу закладки, поле может быть равно нулю. Номера параметров начинаются с 1. Он имеет значение SQL_NO_COLUMN_NUMBER, если запись состояния не связана с номером столбца или номером параметра. Если драйвер не может определить номер столбца или номер параметра, с которым связана эта запись, это поле имеет значение SQL_COLUMN_NUMBER_UNKNOWN. Содержимое этого поля определяется только для дескрипторов инструкций. |
SQL_DIAG_CONNECTION_NAME | SQLCHAR * | Строка, указывающая имя соединения, к которому связана диагностическая запись. Это поле определяется драйвером. Для структур диагностических данных, связанных с дескриптором среды, и для диагностики, не связанной с каким-либо подключением, это поле является строкой нулевой длины. |
SQL_DIAG_MESSAGE_TEXT | SQLCHAR * | Информационное сообщение об ошибке или предупреждении. Это поле отформатировано, как описано в диагностических сообщений. Максимальная длина текста диагностического сообщения отсутствует. |
SQL_DIAG_NATIVE | SQLINTEGER | Собственный код ошибки драйвера или источника данных. Если код машинной ошибки отсутствует, драйвер возвращает значение 0. |
SQL_DIAG_ROW_NUMBER | SQLLEN | Это поле содержит номер строки в наборе строк или номер параметра в наборе параметров, с которым связана запись состояния. Номера строк и номера параметров начинаются с 1. Это поле имеет значение SQL_NO_ROW_NUMBER, если эта запись состояния не связана с номером строки или номером параметра. Если драйвер не может определить номер строки или номер параметра, с которым связана эта запись, это поле имеет значение SQL_ROW_NUMBER_UNKNOWN. Содержимое этого поля определяется только для дескрипторов инструкций. |
SQL_DIAG_SERVER_NAME | SQLCHAR * | Строка, указывающая имя сервера, к которому относится диагностическая запись. Это же значение, возвращаемое для вызова SQLGetInfo с параметром SQL_DATA_SOURCE_NAME. Для структур диагностических данных, связанных с дескриптором среды, и для диагностики, которые не связаны с любым сервером, это поле является строкой нулевой длины. |
SQL_DIAG_SQLSTATE | SQLCHAR * | Пятизначный диагностический код SQLSTATE. Дополнительные сведения см. в SQLSTATEs. |
SQL_DIAG_SUBCLASS_ORIGIN | SQLCHAR * | Строка с тем же форматом и допустимыми значениями, что и SQL_DIAG_CLASS_ORIGIN, идентифицирующая определяющую часть подкласса части кода SQLSTATE. SqlSTATES, для которого возвращается ODBC 3.0, включает в себя следующее: 01S00, 01S01, 01S02, 01S06, 01S07, 07S01, 08S01, 21S01, 21S02, 25S01, 25S02, 25S03, 42S01, 42S02, 42S11, 42S12, 42S21, 42S22, HY095, HY097, HY098, HY099, HY099, HY099, HY100, HY101, HY105, HY107, HY109, HY110, HY111, HYT00, HYT01, IM001, IM002, IM003, IM004, IM005, IM006, IM007, IM008, IM010, IM011, IM012. |
Значения полей динамической функции
В следующей таблице описываются значения SQL_DIAG_DYNAMIC_FUNCTION и SQL_DIAG_DYNAMIC_FUNCTION_CODE, которые применяются к каждому типу инструкции SQL, выполняемой вызовом SQLExecute или SQLExecDirect. Драйвер может добавлять к перечисленным драйверу значения.
Инструкция SQL казненный |
Значение SQL_DIAG_DYNAMIC_FUNCTION |
Значение SQL_DIAG_DYNAMIC_FUNCTION_CODE |
---|---|---|
инструкции alter-domain-statement | ALTER DOMAIN | SQL_DIAG_ALTER_DOMAIN |
инструкции alter-table-statement | ALTER TABLE | SQL_DIAG_ALTER_TABLE |
определения утверждения | CREATEВЕРВЕР | SQL_DIAG_CREATE_ASSERTION |
|
CREATE CHARACTER SET (СОЗДАТЬ СИМВОЛЬНЫЙ НАБОР) | SQL_DIAG_CREATE_CHARACTER_SET |
определения параметров сортировки |
CREATE COLLATION | SQL_DIAG_CREATE_COLLATION |
определения домена |
"CREATE DOMAIN" | SQL_DIAG_CREATE_DOMAIN |
инструкции create-index-statement | CREATE INDEX | SQL_DIAG_CREATE_INDEX |
инструкции create-table-statement | CREATE TABLE | SQL_DIAG_CREATE_TABLE |
инструкции create-view-statement | CREATE VIEW | SQL_DIAG_CREATE_VIEW |
спецификации курсора | "SELECT CURSOR" | SQL_DIAG_SELECT_CURSOR |
delete-statement-positioned | "ДИНАМИЧЕСКИЙ УДАЛЕННЫЙ КУРСОР" | SQL_DIAG_DYNAMIC_DELETE_CURSOR |
delete-statement-searched | "DELETE WHERE" | SQL_DIAG_DELETE_WHERE |
инструкции drop-assert-statement | "DROPВЕРВЕР" | SQL_DIAG_DROP_ASSERTION |
drop-character-set-stmt | DROP CHARACTER SET (DROP CHARACTER SET) | SQL_DIAG_DROP_CHARACTER_SET |
инструкции drop-collation-statement | "DROP COLLATION" | SQL_DIAG_DROP_COLLATION |
инструкции drop-domain-statement |
"DROP DOMAIN" | SQL_DIAG_DROP_DOMAIN |
инструкции drop-index-statement |
DROP INDEX | SQL_DIAG_DROP_INDEX |
инструкции drop-schema-statement | "DROP SCHEMA" | SQL_DIAG_DROP_SCHEMA |
инструкции drop-table-statement | DROP TABLE | SQL_DIAG_DROP_TABLE |
инструкции drop-translation-statement | "DROP TRANSLATION" | SQL_DIAG_DROP_TRANSLATION |
инструкции drop-view-statement | "DROP VIEW" | SQL_DIAG_DROP_VIEW |
grantstatement | "GRANT" | SQL_DIAG_GRANT |
инструкции insert-statement | "INSERT" | SQL_DIAG_INSERT |
ODBC-procedure-extension | "CALL" | вызов SQL_DIAG_ |
отзыв инструкции | "ОТМЕНА" | SQL_DIAG_REVOKE |
определения схемы | Create SCHEMA (CREATE SCHEMA) | SQL_DIAG_CREATE_SCHEMA |
определения перевода | CREATE TRANSLATION | SQL_DIAG_CREATE_TRANSLATION |
с позицией инструкции update-statement | "ДИНАМИЧЕСКИЙ КУРСОР ОБНОВЛЕНИЯ" | SQL_DIAG_DYNAMIC_UPDATE_CURSOR |
с обновлением и инструкцией | "UPDATE WHERE" | SQL_DIAG_UPDATE_WHERE |
Неизвестный | пустую строку | SQL_DIAG_UNKNOWN_STATEMENT |
Последовательность записей состояния
Записи состояния размещаются в последовательности на основе номера строки и типа диагностики. Диспетчер драйверов определяет окончательный порядок возврата записей состояния, создаваемых им. Драйвер определяет окончательный порядок возврата записей состояния, создаваемых им.
Если диагностические записи публикуются диспетчером драйверов и драйвером, диспетчер драйверов отвечает за их заказ.
Если есть две или более записей состояния, последовательность записей определяется первым номером строки. Следующие правила применяются к определению последовательности диагностических записей по строкам:
Записи, которые не соответствуют какой-либо строке, отображаются перед записями, соответствующими определенной строке, так как SQL_NO_ROW_NUMBER определен как -1.
Записи, для которых номер строки неизвестен перед всеми остальными записями, так как SQL_ROW_NUMBER_UNKNOWN определен как -2.
Для всех записей, относящихся к определенным строкам, записи сортируются по значению в поле SQL_DIAG_ROW_NUMBER. Перечислены все ошибки и предупреждения первой строки, а затем все ошибки и предупреждения следующей строки, и т. д.
Заметка
Диспетчер драйверов ODBC 3*.x* не упорядочивает записи состояния в очереди диагностики, если sqlSTATE 01S01 (ошибка в строке) возвращается драйвером ODBC 2*.x* или возвращается ли SQLSTATE 01S01 (ошибка в строке) Драйвер ODBC 3*.x* при вызове SQLExtendedFetch или SQLSetPos вызывается на курсоре, расположенном с SQLExtendedFetch.
В каждой строке или для всех записей, которые не соответствуют строке или для которой номер строки неизвестен, или для всех этих записей с номером строки, равным SQL_NO_ROW_NUMBER, первая запись определяется с помощью набора правил сортировки. После первой записи порядок других записей, влияющих на строку, не определен. Приложение не может предположить, что ошибки предшествуют предупреждениям после первой записи. Приложения должны сканировать полную структуру диагностических данных, чтобы получить полные сведения о неудачном вызове функции.
Следующие правила используются для определения первой записи в строке. Запись с самым высоким рангом является первой записью. Источник записи (диспетчер драйверов, драйвер, шлюз и т. д.) не учитывается при ранжировании записей.
записи о состоянии, описывающие ошибки, имеют самый высокий рейтинг. К ошибкам сортировки применяются следующие правила:
Записи, указывающие на сбой транзакции или возможный сбой транзакции, выделяющие все остальные записи.
Если две или более записей описывают одно и то же условие ошибки, то SQLSTATEs, определенные спецификацией Open Group CLI (классы 03–ГЦ), не используют ODBC и определяемые драйвером SQLSTATEs.
,определяемые реализацией Значения данных, записи состояния, описывающие значения данных, определяемые драйвером no (класс 02), имеют второй самый высокий рейтинг.
предупреждения записи состояния, описывающие предупреждения (класс 01), имеют самый низкий ранг. Если две или более записей описывают одно и то же условие предупреждения, то предупреждение SQLSTATEs, определенное спецификацией Open Group CLI, выдается определение ODBC и определяемые драйвером SQLSTATEs.
Связанные функции
Сведения о | Видеть |
---|---|
Получение нескольких полей структуры диагностических данных | функция SQLGetDiagRec |
См. также
Справочник по API ODBC
файлы заголовков ODBC