Функция SQLSetDescField

Соответствие
Введенная версия: Соответствие стандартам ODBC 3.0: ISO 92

Сводка
SQLSetDescField задаёт значение одного поля записи дескриптора.

Syntax

SQLRETURN SQLSetDescField(  
     SQLHDESC      DescriptorHandle,  
     SQLSMALLINT   RecNumber,  
     SQLSMALLINT   FieldIdentifier,  
     SQLPOINTER    ValuePtr,  
     SQLINTEGER    BufferLength);  

Arguments

DescriptorHandle
[Ввод] Дескрипторная ручка.

RecNumber
[Ввод] Указывает запись дескриптора, содержащая поле, которое приложение стремится завести. Записи Descriptor нумеруются начиная с 0, при этом запись нумеруется как запись с закладкой. Аргумент RecNumber игнорируется для полей заголовка.

FieldIdentifier
[Ввод] Указывает поле дескриптора, значение которого должно быть зададено. Для получения дополнительной информации см. раздел «Аргумент FieldIdentifier » в разделе «Комментарии».

ValuePtr
[Ввод] Указатель на буфер, содержащий информацию о дескрипторе, или на целое значение. Тип данных зависит от значения FieldIdentifier. Если ValuePtr является целочисленным значением, его можно рассматривать как 8 байт (SQLLEN), 4 байта (SQLINTEGER) или 2 байта (SQLSMALLINT), в зависимости от значения аргумента FieldIdentifier .

BufferLength
[Ввод] Если FieldIdentifier — это поле, определённое ODBC, и ValuePtr указывает на строку символа или бинарный буфер, этот аргумент должен быть длиной *ValuePtr. Для данных строк символов этот аргумент должен содержать количество байт в строке.

Если FieldIdentifier — это поле, определённое ODBC, а ValuePtr — целое число, BufferLength игнорируется.

Если FieldIdentifier — это поле, определяемое драйвером, приложение указывает природу поля Driver Manager, устанавливая аргумент BufferLength . BufferLength может иметь следующие значения:

  • Если ValuePtr — это указатель на строку символа, то BufferLength — это длина строки или SQL_NTS.

  • Если ValuePtr является указателем на двоичный буфер, то приложение помещает результат макроса SQL_LEN_BINARY_ATTR(length) в BufferLength. Это ставит отрицательное значение в BufferLength.

  • Если ValuePtr — это указатель на значение, отличное от строки символа или бинарной строки, то BufferLength должен иметь значение SQL_IS_POINTER.

  • Если ValuePtr содержит значение фиксированной длины, то BufferLength — это либо SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT или SQL_IS_USMALLINT, в зависимости от необходимости.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR или SQL_INVALID_HANDLE.

Diagnostics

Когда SQLSetDescField возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO, связанное значение SQLSTATE можно получить, вызвав SQLGetDiagRec с помощью HandleType SQL_HANDLE_DESC и HandleDescriptorHandle. В следующей таблице перечислены значения SQLSTATE, которые обычно возвращает SQLSetDescField , и каждое из них объясняется в контексте этой функции; обозначение «(DM)» предшествует описаниям SQLSTATE, возвращаемым менеджером драйверов. Возвращаемый код, связанный с каждым значением SQLSTATE, SQL_ERROR, если не указано иное.

SQLSTATE Ошибка Description
01000 Общее предупреждение Информационное сообщение для конкретного драйвера. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01S02 Изменено значение параметра Драйвер не поддерживал значение, указанное в *ValuePtr (если ValuePtr был указателем), или значение в ValuePtr (если ValuePtr был целочисленным значением), или *ValuePtr был невалиден из-за условий реализации работы, поэтому драйвер подменил аналогичное значение. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
07009 Индекс некорректного дескриптора Аргумент FieldIdentifier был полем записи, аргумент RecNumber равен 0, а аргумент DescriptorHandle ссылался на дескриптор IPD.

Аргумент RecNumber был меньше 0, а аргумент DescriptorHandle ссылался на ARD или APD.

Аргумент RecNumber был больше максимального количества столбцов или параметров, которые может поддерживать источник данных, и аргумент DescriptorHandle отсылал к APD или ARD.

(DM) Аргумент FieldIdentifier был SQL_DESC_COUNT, а *ValuePtr — меньше 0.

Аргумент RecNumber был равен 0, а аргумент DescriptorHandle ссылался на неявно выделенный APD. (Эта ошибка не возникает с явно выделенным дескриптором приложения, поскольку неизвестно, является ли явно выделенный дескриптор приложения APD или ARD до момента выполнения.)
08S01 Сбой связи Связь между драйвером и источником данных, к которому был подключен драйвер, произошел сбой до завершения обработки функции.
22001 Строковые данные, усеченные справа Аргумент FieldIdentifier был SQL_DESC_NAME, а аргумент BufferLength — значением больше, чем SQL_MAX_IDENTIFIER_LEN.
HY000 Общая ошибка Произошла ошибка, для которой не было определенного SQLSTATE и для которого не было определено значение SQLSTATE для конкретной реализации. Сообщение об ошибке, возвращаемое SQLGetDiagRec в буфере *MessageText , описывает ошибку и ее причину.
HY001 Ошибка выделения памяти Драйверу не удалось выделить память, необходимую для поддержки выполнения или завершения функции.
HY010 Ошибка последовательности функций (DM) DescriptorHandle был связан с StatementHandle , для которого вызывалась асинхронно выполняющаяся функция (не эта), которая всё ещё выполнялась во время вызова этой функции.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations или SQLSetPos вызывался для StatementHandle , с которым был связан DescriptorHandle и возвращался SQL_NEED_DATA. Эта функция была вызвана до отправки данных для всех параметров выполнения или столбцов.

(DM) Для дескриптора соединения, связанного с DescriptorHandle, была вызвана асинхронно выполняющаяся функция. Эта асинхронная функция всё ещё выполнялась, когда была вызвана функция SQLSetDescField .

(DM) SQLExecute, SQLExecDirect или SQLMoreResults вызывался для одного из операторов, связанных с DescriptorHandle , и возвращался SQL_PARAM_DATA_AVAILABLE. Эта функция была вызвана до получения данных для всех потоковых параметров.
HY013 Ошибка управления памятью Не удалось обработать вызов функции, так как к базовым объектам памяти не удалось получить доступ, возможно, из-за низкой памяти.
HY016 Нельзя изменить дескриптор строки реализации Аргумент DescriptorHandle был связан с IRD, а аргумент FieldIdentifier не был SQL_DESC_ARRAY_STATUS_PTR или SQL_DESC_ROWS_PROCESSED_PTR.
HY021 Несогласованная информация о описаниях Поля SQL_DESC_TYPE и SQL_DESC_DATETIME_INTERVAL_CODE не образуют действительный тип ODBC SQL или валидный драйвер-специфический тип SQL (для IPD), или действительный тип ODBC C (для APD или ARD).

Информация о дескрипторах, проверяемая во время проверки согласованности, была непоследовательной. (См. «Проверка согласованности» в SQLSetDescRec.)
HY090 Недопустимая длина строки или буфера (DM) *ValuePtr — это строка символа, а BufferLength был меньше нуля, но не равен SQL_NTS.

(DM) Драйвер был драйвером ODBC 2*.x*, дескриптор — ARD, аргумент ColumnNumber был установлен в 0, а значение для аргумента BufferLength не равно 4.
HY091 Идентификатор поля некорректного дескриптора Значение, указанное для аргумента FieldIdentifier , не было полем, определённым ODBC, и не было определённым реализацией.

Аргумент FieldIdentifier был недопустим для аргумента DescriptorHandle .

Аргумент FieldIdentifier был полем только для чтения, определённым ODBC.
HY092 Некорректный идентификатор атрибута/опции Значение в *ValuePtr не было допустимо для аргумента FieldIdentifier .

Аргумент FieldIdentifier был SQL_DESC_UNNAMED, а ValuePtr — SQL_NAMED.
HY105 Недопустимый тип параметра (DM) Значение, указанное для поля SQL_DESC_PARAMETER_TYPE, было недействительным. (Для дополнительной информации см. раздел «InputOutputType Argument» в SQLBindParameter.)
HY117 Подключение приостановлено из-за неизвестного состояния транзакции. Разрешены только функции отключения и только для чтения. (DM) Для получения дополнительной информации о приостановленном состоянии см. Что нового в ODBC 3.8.
HYT01 Время ожидания для подключения истекло Срок ожидания подключения истек до того, как источник данных ответил на запрос. Период времени ожидания подключения задается через SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Драйвер не поддерживает эту функцию (DM) Драйвер, связанный с DescriptorHandle , не поддерживает эту функцию.

Comments

Приложение может вызвать SQLSetDescField для установки любого дескрипторного поля по одному. Один вызов SQLSetDescField задаёт одно поле в одном дескрипторе. Эту функцию можно вызвать для задания любого поля в любом типе дескриптора, при условии, что это поле может быть установлено. (См. таблицу ниже в этом разделе.)

Примечание.

Если вызов SQLSetDescField не выполняется, содержимое записи дескриптора, идентифицируемого аргументом RecNumber , остаётся неопределённым.

Другие функции могут быть вызваны для установки нескольких полей дескриптора одним вызовом функции. Функция SQLSetDescRec задаёт различные поля, влияющие на тип данных и буфер, привязанный к столбцу или параметру (поля SQL_DESC_TYPE, SQL_DESC_DATETIME_INTERVAL_CODE, SQL_DESC_OCTET_LENGTH, SQL_DESC_PRECISION, SQL_DESC_SCALE, SQL_DESC_DATA_PTR, SQL_DESC_OCTET_LENGTH_PTR и SQL_DESC_INDICATOR_PTR). SQLBindCol или SQLBindParameter могут использоваться для создания полной спецификации связки столбца или параметра. Эти функции задают определённую группу дескрипторных полей с помощью одного вызова функции.

SQLSetDescField можно вызвать для изменения буферов связывания, добавив смещение к указателям связывания (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR или SQL_DESC_OCTET_LENGTH_PTR). Это изменяет буферы привязки без вызова SQLBindCol или SQLBindParameter, что позволяет приложению менять SQL_DESC_DATA_PTR без изменения других полей, таких как SQL_DESC_DATA_TYPE.

Если приложение вызывает SQLSetDescField для установки любого поля, отличного от SQL_DESC_COUNT или отложенных полей SQL_DESC_DATA_PTR, SQL_DESC_OCTET_LENGTH_PTR или SQL_DESC_INDICATOR_PTR, запись становится свободной.

Поля заголовков Descriptor задаются вызовом SQLSetDescField с соответствующим идентификатором поля. Многие поля заголовков также являются атрибутами операторов, поэтому их можно также задать вызовом SQLSetStmtAttr. Это позволяет приложениям задавать поле дескриптора без предварительного получения дескрипторного дескриптора. Когда SQLSetDescField вызывается для установки заголовочного поля, аргумент RecNumber игнорируется.

Для установки полей закладок используется RecNumber 0.

Примечание.

Атрибут оператора SQL_ATTR_USE_BOOKMARKS всегда должен быть задан перед вызовом SQLSetDescField для установки полей-закладок. Хотя это не обязательно, настоятельно рекомендую.

Последовательность полей дескрипторов настроек

При установке дескрипторных полей с помощью вызова SQLSetDescField приложение должно следовать определённой последовательности:

  1. В приложении сначала должно быть указано поле SQL_DESC_TYPE, SQL_DESC_CONCISE_TYPE или SQL_DESC_DATETIME_INTERVAL_CODE.

  2. После того как одно из этих полей установлено, приложение может задать атрибут типа данных, а драйвер устанавливает поля атрибутов типа данных на соответствующие значения по умолчанию для этого типа. Автоматическое удаление полей атрибутов типа по умолчанию гарантирует, что дескриптор всегда готов к использованию после того, как приложение определило тип данных. Если приложение явно устанавливает атрибут типа данных, оно переопределяет стандартный атрибут.

  3. После того как одно из полей, указанных на шаге 1, и атрибуты типа данных установлены, приложение может установить SQL_DESC_DATA_PTR. Это вызывает проверку согласованности дескрипторных полей. Если приложение меняет тип данных или атрибуты после установки поля SQL_DESC_DATA_PTR, драйвер устанавливает SQL_DESC_DATA_PTR на нулевой указатель, развязывая запись. Это заставляет приложение выполнять правильные шаги последовательно, прежде чем запись дескриптора станет пригодна.

Инициализация полей дескриптора

Когда выделен дескриптор, поля в дескрипторе могут быть инициализованы по умолчанию, инициализированы без стандартного значения или не определёнными для типа дескриптора. Следующие таблицы показывают инициализацию каждого поля для каждого типа дескриптора: «D» означает, что поле инициализовано по умолчанию, а «ND» — что поле инициализовано без стандартного значения. Если отображается число, значение поля по умолчанию — это именно это число. Таблицы также указывают, является ли поле чтением/записью (R/W) или только для чтения (R).

Поля IRD имеют значение по умолчанию только после того, как оператор был подготовлен или выполнен и IRD заполнен, а не после выделения оператора или дескриптора. Пока IRD не будет заполнен, любая попытка получить доступ к полю IRD приведёт к ошибке.

Некоторые дескрипторные поля определяются для одного или нескольких, но не всех типов дескрипторов (ARD и IRD, APD и IPD). Когда поле не определёно для типа дескриптора, оно не требуется ни одной из функций, использующих этот дескриптор.

Поля, доступные через SQLGetDescField , не обязательно устанавливаются SQLSetDescField. Поля, которые могут быть установлены SQLSetDescField , перечислены в следующих таблицах.

Инициализация полей заголовков изложена в приведённой ниже таблице.

Название поля заголовка Type R/W Default
SQL_DESC_ALLOC_TYPE SQLSMALLINT ARD: R APD: R IRD: R IPD: R ARD: SQL_DESC_ALLOC_AUTO для неявного или SQL_DESC_ALLOC_USER для явного

APD: SQL_DESC_ALLOC_AUTO для неявного или SQL_DESC_ALLOC_USER для явного

IRD: SQL_DESC_ALLOC_AUTO

IPD: SQL_DESC_ALLOC_AUTO
SQL_DESC_ARRAY_SIZE SQLULEN ARD: R/W APD: R/W IRD: Неиспользованный IPD: Не использован ARD:[1] APD:[1] IRD: Неиспользованный IPD: Неиспользованный
SQL_DESC_ARRAY_STATUS_PTR SQLUSMALLINT* ARD: R/W APD: R/W IRD: R/W IPD: R/W ARD: Null ptr APD: Null ptr IRD: Null ptr IPD: Null ptr
SQL_DESC_BIND_OFFSET_PTR SQLLEN* ARD: R/W APD: R/W IRD: Неиспользованный IPD: Не использован ARD: Null ptr APD: Null ptr IRD: Неиспользованный IPD: Не использован
SQL_DESC_BIND_TYPE SQLINTEGER ARD: R/W APD: R/W IRD: Неиспользованный IPD: Не использован ARD: SQL_BIND_BY_COLUMN

APD: SQL_BIND_BY_COLUMN

IRD: Не используется

IPD: Не используется
SQL_DESC_COUNT SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: 0 APD: 0 IRD: D IPD: 0
SQL_DESC_ROWS_PROCESSED_PTR SQLULEN* ARD: Неиспользованный APD: Неиспользованный IRD: R/W IPD: R/W ARD: Неиспользованный APD: Неиспользованный IRD: Null ptr IPD: Null ptr

[1] Эти поля определяются только тогда, когда IPD автоматически заполняется драйвером. Если нет, они не определены. Если приложение пытается задать эти поля, будет возвращен SQLSTATE HY091 (Invalid descriptor field identifier).

Инициализация полей записи показана в следующей таблице.

Название поля записи Type R/W Default
SQL_DESC_AUTO_UNIQUE_VALUE SQLINTEGER ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_BASE_COLUMN_NAME SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_BASE_TABLE_NAME SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
ОПИСАНИЕ_SQL_ЧУВСТВИТЕЛЬНОСТЬ_К_РЕГИСТРУ SQLINTEGER ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: R ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: D[1]
SQL_DESC_CATALOG_NAME SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_CONCISE_TYPE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: SQL_C_ DEFAULT APD: SQL_C_ DEFAULT IRD: D IPD: ND
SQL_DESC_DATA_PTR SQLPOINTER ARD: R/W APD: R/W IRD: Неиспользованный IPD: Не использован ARD: Null ptr APD: Null ptr IRD: Неиспользованный IPD: Неиспользован[2]
SQL_DESC_DATETIME_INTERVAL_CODE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_DATETIME_INTERVAL_PRECISION SQLINTEGER ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_DISPLAY_SIZE SQLLEN ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_FIXED_PREC_SCALE SQLSMALLINT ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: R ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: D[1]
SQL_DESC_INDICATOR_PTR SQLLEN * ARD: R/W APD: R/W IRD: Неиспользованный IPD: Не использован ARD: Null ptr APD: Null ptr IRD: Неиспользованный IPD: Не использован
SQL_DESC_LABEL SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_LENGTH SQLULEN ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_LITERAL_PREFIX SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_LITERAL_SUFFIX SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_LOCAL_TYPE_NAME SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: R ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: D[1]
SQL_DESC_NAME SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_NULLABLE (SQL: возможность значения NULL) SQLSMALLINT ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: R ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_NUM_PREC_RADIX SQLINTEGER ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_OCTET_LENGTH SQLLEN ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_OCTET_LENGTH_PTR SQLLEN * ARD: R/W APD: R/W IRD: Неиспользованный IPD: Не использован ARD: Null ptr APD: Null ptr IRD: Неиспользованный IPD: Не использован
SQL_DESC_PARAMETER_TYPE SQLSMALLINT ARD: Неиспользованный APD: Неиспользованный IRD: Неиспользованный IPD: R/W ARD: Неиспользованный APD: Неиспользованный IRD: Неиспользованный IPD: D=SQL_PARAM_INPUT
SQL_DESC_PRECISION SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_ROWVER SQLSMALLINT ARD: Не использовался

APD: Не использовался

IRD: R

IPD: R
ARD: Не использовался

APD: Не использовался

IRD: ND

IPD: ND
SQL_DESC_SCALE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_SCHEMA_NAME SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_SEARCHABLE SQLSMALLINT ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_TABLE_NAME SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован
SQL_DESC_TYPE SQLSMALLINT ARD: R/W APD: R/W IRD: R IPD: R/W ARD: SQL_C_DEFAULT APD: SQL_C_DEFAULT IRD: D IPD: ND
SQL_DESC_TYPE_NAME SQLCHAR * ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: R ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: D[1]
SQL_DESC_UNNAMED SQLSMALLINT ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: R/W ARD: ND APD: ND IRD: D IPD: ND
SQL_DESC_UNSIGNED SQLSMALLINT ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: R ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: D[1]
SQL_DESC_UPDATABLE SQLSMALLINT ARD: Неиспользованный APD: Неиспользованный IRD: R IPD: Не использован ARD: Неиспользованный APD: Неиспользованный IRD: D IPD: Не использован

[1] Эти поля определяются только тогда, когда IPD автоматически заполняется драйвером. Если нет, они не определены. Если приложение пытается задать эти поля, будет возвращен SQLSTATE HY091 (Invalid descriptor field identifier).

[2] Поле SQL_DESC_DATA_PTR в IPD можно настроить так, чтобы принудительно провести проверку согласованности. В последующем вызове SQLGetDescField или SQLGetDescRec драйвер не обязан возвращать значение, которое SQL_DESC_DATA_PTR было установлено.

Аргумент идентификатора поля

Аргумент FieldIdentifier указывает на задающее дескрипторное поле. Дескриптор содержит заголовок дескриптора, состоящий из полей заголовка, описанных в следующем разделе «Поля заголовка», и нуля или более записей дескрипторов, состоящих из полей записей, описанных в разделе после раздела «Поля заголовка».

Заголовочные поля

Каждый дескриптор имеет заголовок, состоящий из следующих полей:

SQL_DESC_ALLOC_TYPE [Все]
Это поле заголовка SQLSMALLINT только для чтения указывает, был ли дескриптор выделен автоматически драйвером или явно приложением. Приложение может получить, но не изменять это поле. Поле задаётся SQL_DESC_ALLOC_AUTO драйвером, если дескриптор был автоматически выделен драйвером. Драйвер устанавливает SQL_DESC_ALLOC_USER, если дескриптор был явно выделен приложением.

SQL_DESC_ARRAY_SIZE [Дескрипторы применения]
В ARD это поле заголовка SQLULEN указывает количество строк в наборе строк. Это количество строк, которые возвращаются вызовом SQLFetch или SQLFetchScroll или которые будут обрабатываться вызовом SQLBulkOperations или SQLSetPos.

В APD это поле заголовка SQLULEN указывает количество значений для каждого параметра.

Значение по умолчанию этого поля — 1. Если SQL_DESC_ARRAY_SIZE больше 1, SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR и SQL_DESC_OCTET_LENGTH_PTR APD или ARD указывают на массивы. Мощность каждого массива равна значению этого поля.

Это поле в ARD также можно установить, вызывая SQLSetStmtAttr с атрибутом SQL_ATTR_ROW_ARRAY_SIZE. Это поле в APD также можно установить, вызвав SQLSetStmtAttr с атрибутом SQL_ATTR_PARAMSET_SIZE.

SQL_DESC_ARRAY_STATUS_PTR [Все]
Для каждого типа дескриптора это поле заголовка SQLUSMALLINT * указывает на массив значений SQLUSMALLINT. Эти массивы называются следующим образом: массив состояния строки (IRD), массив статуса параметров (IPD), массив операций строки (ARD) и массив операций параметров (APD).

В IRD это поле заголовка указывает на массив статуса строки, содержащий значения состояния после вызова SQLBulkOperations, SQLFetch, SQLFetchScroll или SQLSetPos. Массив содержит столько элементов, сколько и строк в наборе рядов. Приложение должно выделить массив SQLUSMALLINT и установить это поле так, чтобы оно указывало на массивы. По умолчанию поле установлено как нулевой указатель. Драйвер заполняет массив — если только поле SQL_DESC_ARRAY_STATUS_PTR не установлено на нулевой указатель, тогда значения статуса не генерируются и массив не заполняется.

Caution

Поведение драйвера не определяется, если приложение задаёт элементы массива строк статуса, на которые указывает поле SQL_DESC_ARRAY_STATUS_PTR IRD.

Массив изначально заполняется вызовом SQLBulkOperations, SQLFetch, SQLFetchScroll или SQLSetPos. Если вызов не возвращал SQL_SUCCESS или SQL_SUCCESS_WITH_INFO, содержимое массива, на которое указывает это поле, неопределено. Элементы массива могут содержать следующие значения:

  • SQL_ROW_SUCCESS: Ряд был успешно взят и не изменился с момента последнего покупки.

  • SQL_ROW_SUCCESS_WITH_INFO: Ряд был успешно взят и не менялся с момента последнего покупки. Однако предупреждение было возвращено о строке.

  • SQL_ROW_ERROR: При получении строки произошла ошибка.

  • SQL_ROW_UPDATED: Ряд был успешно захвачен и обновлялся с момента последнего забора. Если строка снова загружается, её статус — SQL_ROW_SUCCESS.

  • SQL_ROW_DELETED: Строка была удалена с момента последней загрузки.

  • SQL_ROW_ADDED: Строка была вставлена SQLBulkOperations. Если строка снова загружается, её статус — SQL_ROW_SUCCESS.

  • SQL_ROW_NOROW: Набор строк перекрывал конец результата, и ни одна строка, соответствующая этому элементу массива статуса, не возвращалась.

Это поле в IRD также можно установить, вызвав SQLSetStmtAttr с атрибутом SQL_ATTR_ROW_STATUS_PTR.

Поле SQL_DESC_ARRAY_STATUS_PTR в IRD действительно только после возврата SQL_SUCCESS или SQL_SUCCESS_WITH_INFO. Если возвратный код не относится к таким значениям, место, на которое указывает SQL_DESC_ROWS_PROCESSED_PTR, неопределено.

В IPD это поле заголовка указывает на массив статуса параметров, содержащий информацию о состоянии для каждого набора значений параметров после вызова SQLExecute или SQLExecDirect. Если вызов SQLExecute или SQLExecDirect не возвращал SQL_SUCCESS или SQL_SUCCESS_WITH_INFO, содержимое массива, на которое указывает это поле, остаётся неопределённым. Приложение должно выделить массив SQLUSMALLINT и установить это поле так, чтобы оно указывало на массивы. Драйвер заполняет массив — если только поле SQL_DESC_ARRAY_STATUS_PTR не установлено на нулевой указатель, тогда значения статуса не генерируются и массив не заполняется. Элементы массива могут содержать следующие значения:

  • SQL_PARAM_SUCCESS: SQL-оператор был успешно выполнен для этого набора параметров.

  • SQL_PARAM_SUCCESS_WITH_INFO: SQL-оператор был успешно выполнен для этого набора параметров; однако предупреждающая информация доступна в структуре диагностических данных.

  • SQL_PARAM_ERROR: Произошла ошибка при обработке этого набора параметров. Дополнительная информация об ошибках доступна в структуре диагностических данных.

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

  • SQL_PARAM_DIAG_UNAVAILABLE: Диагностическая информация отсутствует. Примером является ситуация, когда драйвер рассматривает массивы параметров как монолитную единицу и поэтому не генерирует такой уровень информации об ошибках.

Это поле в IPD также можно задать вызовом SQLSetStmtAttr с атрибутом SQL_ATTR_PARAM_STATUS_PTR.

В ARD это поле заголовка указывает на массив строковых значений, которые приложение может задать для указания, следует ли игнорировать эту строку для операций SQLSetPos . Элементы массива могут содержать следующие значения:

  • SQL_ROW_PROCEED: Строка включена в операцию массового сбора с использованием SQLSetPos. (Эта настройка не гарантирует, что операция будет выполняться на строке. Если строка имеет статус SQL_ROW_ERROR в массиве IRD строки, драйвер может не смог выполнить операцию в этой строке.)

  • SQL_ROW_IGNORE: Строка исключается из операции массового сбора с помощью SQLSetPos.

Если элементы массива не установлены, все строки включаются в операцию bulk. Если значение в поле SQL_DESC_ARRAY_STATUS_PTR ARD является нулевым указателем, все строки включаются в операцию bulk; Интерпретация такая же, как если бы указатель указывал на действительный массив и все элементы массива были SQL_ROW_PROCEED. Если элемент в массиве установлен в SQL_ROW_IGNORE, значение в массиве статуса строки для игнорируемой строки не меняется.

Это поле в ARD также можно установить, вызывая SQLSetStmtAttr с атрибутом SQL_ATTR_ROW_OPERATION_PTR.

В APD это поле заголовка указывает на массив операций параметров, которые приложение может задать для указания, следует ли игнорировать этот набор параметров при вызове SQLExecute или SQLExecDirect . Элементы массива могут содержать следующие значения:

  • SQL_PARAM_PROCEED: Набор параметров включен в вызов SQLExecute или SQLExecDirect .

  • SQL_PARAM_IGNORE: Набор параметров исключается из вызова SQLExecute или SQLExecDirect .

Если элементы массива не установлены, все наборы параметров массива используются в вызовах SQLExecute или SQLExecDirect . Если значение в поле SQL_DESC_ARRAY_STATUS_PTR APD является нулевым указателем, используются все наборы параметров; Интерпретация такая же, как если бы указатель указывал на действительный массив и все элементы массива были SQL_PARAM_PROCEED.

Это поле в APD также можно установить, вызвав SQLSetStmtAttr с атрибутом SQL_ATTR_PARAM_OPERATION_PTR.

SQL_DESC_BIND_OFFSET_PTR [Дескрипторы приложений]
Это поле заголовка SQLLEN * указывает на смещение связывания. По умолчанию он установлен на нулевой указатель. Если это поле не является нулевым указателем, драйвер дедеферирует указатель и добавляет дедеференцированное значение каждому из отложенных полей, которые имеют ненулевые значения в записи дескриптора (SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR и SQL_DESC_OCTET_LENGTH_PTR), при этом при привязке использует новые значения указателя.

Смещение связи всегда напрямую добавляется к значениям в полях SQL_DESC_DATA_PTR, SQL_DESC_INDICATOR_PTR и SQL_DESC_OCTET_LENGTH_PTR. Если смещение изменяется на другое, новое значение всё равно добавляется напрямую к значению в каждом поле дескриптора. Новое смещение не добавляется к значению поля плюс к предыдущему смещению.

Это поле является отложенным полем: оно не используется в момент установки, а применяется драйвером позже, когда необходимо определить адреса буферов данных.

Это поле в ARD также можно установить, вызывая SQLSetStmtAttr с атрибутом SQL_ATTR_ROW_BIND_OFFSET_PTR. Это поле в ARD также можно установить, вызывая SQLSetStmtAttr с атрибутом SQL_ATTR_PARAM_BIND_OFFSET_PTR.

Для получения дополнительной информации см. описание привязки по строкам в SQLFetchScroll и SQLBindParameter.

SQL_DESC_BIND_TYPE [Дескрипторы приложений]
Это поле заголовка SQLUINTEGER задаёт ориентацию связки для привязки либо столбцов, либо параметров.

В ARD это поле задаёт ориентацию связки, когда SQLFetchScroll или SQLFetch вызываются на связанном операторе.

Для выбора поколонкового привязки для столбцов это поле устанавливается на SQL_BIND_BY_COLUMN (по умолчанию).

Это поле в ARD также можно установить, вызывая SQLSetStmtAttr с атрибутом SQL_ATTR_ROW_BIND_TYPE.

В APD это поле задаёт ориентацию связи, используемую для динамических параметров.

Для выбора привязки по столбцам параметров это поле устанавливается на SQL_BIND_BY_COLUMN (по умолчанию).

Это поле в APD также можно установить, вызывая SQLSetStmtAttr с атрибутом SQL_ATTR_PARAM_BIND_TYPE.

SQL_DESC_COUNT [Все]
Это поле заголовка SQLSMALLINT указывает индекс на основе 1 записи с наивысшим номером, содержащей данные. Когда драйвер задаёт структуру данных для дескриптора, он также должен установить поле SQL_DESC_COUNT, показывающее, сколько записей значимы. Когда приложение выделяет экземпляр этой структуры данных, ему не нужно указывать, сколько записей нужно резервировать место. По мере того как приложение указывает содержимое записей, драйвер предпринимает все необходимые действия, чтобы убедиться, что дескриптор ссылается на структуру данных достаточного размера.

SQL_DESC_COUNT — это не счёт всех столбцов данных, которые связаны (если поле находится в ARD), или всех связанных параметров (если поле находится в APD), а число записи с наивысшим номером. Если столбец или параметр с самым высоким номером не связаны, то SQL_DESC_COUNT меняется на номер следующего по величине столбца или параметра. Если столбец или параметр с числом меньше числа столбца с наивысшим номером не связан (вызывая SQLBindCol с аргументом TargetValuePtr на нулевой указатель, или SQLBindParameter с аргументом ParameterValuePtr , установленным на нулевой указатель), SQL_DESC_COUNT не меняется. Если дополнительные столбцы или параметры связаны числами, превышающими запись с наивысшим номером, содержащим данные, драйвер автоматически увеличивает значение в поле SQL_DESC_COUNT. Если все столбцы не связаны вызовом SQLFreeStmt с опцией SQL_UNBIND, поля SQL_DESC_COUNT в ARD и IRD устанавливаются в 0. Если SQLFreeStmt вызывается с опцией SQL_RESET_PARAMS, SQL_DESC_COUNT поля в APD и IPD устанавливаются в 0.

Значение в SQL_DESC_COUNT может быть установлено явно приложением, вызвав SQLSetDescField. Если значение в SQL_DESC_COUNT явно уменьшается, все записи с числами, превышающими новое значение в SQL_DESC_COUNT, фактически удаляются. Если значение в SQL_DESC_COUNT явно установлено как 0, а поле находится в ARD, освобождаются все буферы данных, кроме столбца с привязанными закладками.

Количество записей в этом поле ARD не включает переплетённую колонку закладок. Единственный способ развязать столбец закладок — установить поле SQL_DESC_DATA_PTR на нулевой указатель.

SQL_DESC_ROWS_PROCESSED_PTR [Дескрипторы реализации]
В IRD это поле заголовка SQLULEN * указывает на буфер, содержащий количество строк, полученных после вызова SQLFetch или SQLFetchScroll, либо количество строк, затронутых в массовой операции, выполняемой вызовом SQLBulkOperations или SQLSetPos, включая строки ошибок.

В IPD это поле заголовка SQLUINTEGER * указывает на буфер, содержащий количество обработанных наборов параметров, включая наборы ошибок. Если это нулевой указатель, число не будет возвращено.

SQL_DESC_ROWS_PROCESSED_PTR действительна только после того, как SQL_SUCCESS или SQL_SUCCESS_WITH_INFO были возвращены после вызова SQLFetch или SQLFetchScroll (для IRD-поля) или SQLExecute, SQLExecDirect или SQLParamData (для IPD-поля). Если вызов, заполняющий буфер, на который указывает это поле, не возвращает SQL_SUCCESS или SQL_SUCCESS_WITH_INFO, содержимое буфера не определёно, если только он не возвращает SQL_NO_DATA, тогда значение буфера устанавливается как 0.

Это поле в ARD также можно установить, вызвав SQLSetStmtAttr с атрибутом SQL_ATTR_ROWS_FETCHED_PTR. Это поле в APD также можно установить, вызывая SQLSetStmtAttr с атрибутом SQL_ATTR_PARAMS_PROCESSED_PTR.

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

Рекордные поля

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

SQL_DESC_AUTO_UNIQUE_VALUE [IRDs]
Это поле записи SQLINTEGER только для чтения содержит SQL_TRUE, является ли столбец авто-инкрементующимся, или SQL_FALSE, если столбец не является авто-инкрементующимся. Это поле только для чтения, но столбец автоувеличения не обязательно является только для чтения.

SQL_DESC_BASE_COLUMN_NAME [IRDs]
Это поле записи SQLCHAR * только для чтения содержит базовое имя столбца для столбца набора результатов. Если имя базового столбца не существует (как в случае столбцов, являющихся выражениями), эта переменная содержит пустую строку.

SQL_DESC_BASE_TABLE_NAME [IRD]
Это поле записи SQLCHAR * только для чтения содержит базовое название таблицы столбца набора результатов. Если имя базовой таблицы невозможно определить или не применимо, эта переменная содержит пустую строку.

SQL_DESC_CASE_SENSITIVE [Дескрипторы реализации]
Это поле записи SQLINTEGER, предназначенное только для чтения, содержит SQL_TRUE, считается ли столбец или параметр чувствительным к регистру при сближениях и сравнениях, или SQL_FALSE, если столбец не считается чувствительным к регистру для сравнений и сравнений или если это несимвольный столбец.

SQL_DESC_CATALOG_NAME [IRD]
Это поле записи SQLCHAR * только для чтения содержит каталог базовой таблицы, содержащей столбец. Возвращаемое значение зависит от драйвера, является ли столбец выражением или если столбец является частью представления. Если источник данных не поддерживает каталоги или каталог не может быть определен, эта переменная содержит пустую строку.

SQL_DESC_CONCISE_TYPE [Все]
Это поле заголовка SQLSMALLINT определяет краткий тип данных для всех типов данных, включая типы данных datetime и interval data.

Значения в полях SQL_DESC_CONCISE_TYPE, SQL_DESC_TYPE и SQL_DESC_DATETIME_INTERVAL_CODE взаимозависимы. Каждый раз, когда одно из полей устанавливается, должно быть установлено и другое. SQL_DESC_CONCISE_TYPE можно задать вызовом SQLBindCol или SQLBindParameter, или SQLSetDescField. SQL_DESC_TYPE можно задать вызовом SQLSetDescField или SQLSetDescRec.

Если SQL_DESC_CONCISE_TYPE установлен на краткий тип данных, отличный от интервала или типа времени, поле SQL_DESC_TYPE устанавливается на то же значение, а поле SQL_DESC_DATETIME_INTERVAL_CODE — в 0.

Если SQL_DESC_CONCISE_TYPE установлен на краткий тип данных времени или интервала, поле SQL_DESC_TYPE устанавливается на соответствующий тип многословного (SQL_DATETIME или SQL_INTERVAL), а поле SQL_DESC_DATETIME_INTERVAL_CODE — на соответствующий подкод.

SQL_DESC_DATA_PTR [Дескрипторы приложений и IPD]
Это поле записи SQLPOINTER указывает на переменную, которая содержит значение параметра (для APD) или столбце (для ARD). Это поле является отложенным. Он не используется в момент настройки, а используется драйвером позже для получения данных.

Столбец, заданный полем SQL_DESC_DATA_PTR ARD, не связан с ним, если аргумент TargetValuePtr в вызове SQLBindCol является нулевым указателем, или если SQL_DESC_DATA_PTR поле в ARD задаётся вызовом SQLSetDescField или SQLSetDescRec нулевого указателя. Другие поля не затрагиваются, если поле SQL_DESC_DATA_PTR установлено на нулевой указатель.

Если вызов SQLFetch или SQLFetchScroll , заполняющий буфер, указанный этим полем, не возвращал SQL_SUCCESS или SQL_SUCCESS_WITH_INFO, содержимое буфера не определёно.

Всякий раз, когда SQL_DESC_DATA_PTR поле APD, ARD или IPD установлено, драйвер проверяет, что значение в поле SQL_DESC_TYPE содержит один из действительных типов данных ODBC C или специфичный для драйвера тип данных, и что все остальные поля, влияющие на типы данных, согласованы. Запрос на проверку согласованности — единственное использование поля SQL_DESC_DATA_PTR в IPD. В частности, если приложение устанавливает SQL_DESC_DATA_PTR поле IPD и позже вызывает SQLGetDescField на этом поле, оно не обязательно возвращает установленное значение. Для получения дополнительной информации см. раздел «Проверки согласованности» в SQLSetDescRec.

SQL_DESC_DATETIME_INTERVAL_CODE [Все]
Это поле записи SQLSMALLINT содержит подкод для конкретного типа данных времени или интервала, когда поле SQL_DESC_TYPE SQL_DATETIME или SQL_INTERVAL. Это верно как для типов данных SQL, так и для C. Код состоит из названия типа данных, где «CODE» заменяется либо на «TYPE» или «C_TYPE» (для типов datetime), либо «CODE» вместо «INTERVAL» или «C_INTERVAL» (для интервальных типов).

Если SQL_DESC_TYPE и SQL_DESC_CONCISE_TYPE в дескрипторе приложения установлены в SQL_C_DEFAULT, а дескриптор не связан с дескриптором оператора, содержимое SQL_DESC_DATETIME_INTERVAL_CODE не определёно.

Это поле можно задать для типов данных datetime, указанных в следующей таблице.

Типы времени свиданий DATETIME_INTERVAL_CODE
SQL_TYPE_DATE/SQL_C_TYPE_DATE SQL_CODE_DATE
SQL_TYPE_TIME/SQL_C_TYPE_TIME SQL_CODE_TIME
SQL_TYPE_TIMESTAMP/ SQL_C_TYPE_TIMESTAMP SQL_CODE_TIMESTAMP

Это поле можно задать для типов интервальных данных, указанных в следующей таблице.

Тип интервала DATETIME_INTERVAL_CODE
SQL_INTERVAL_DAY/ SQL_C_INTERVAL_DAY SQL_CODE_DAY
SQL_INTERVAL_DAY_TO_HOUR/ SQL_C_INTERVAL_DAY_TO_HOUR SQL_CODE_DAY_TO_HOUR
SQL_INTERVAL_DAY_TO_MINUTE/ SQL_C_INTERVAL_DAY_TO_MINUTE SQL_CODE_DAY_TO_MINUTE
SQL_INTERVAL_DAY_TO_SECOND/ SQL_C_INTERVAL_DAY_TO_SECOND SQL_CODE_DAY_TO_SECOND
SQL_INTERVAL_HOUR/ SQL_C_INTERVAL_HOUR SQL_CODE_HOUR
SQL_INTERVAL_HOUR_TO_MINUTE/ SQL_C_INTERVAL_HOUR_TO_MINUTE SQL_CODE_HOUR_TO_MINUTE
SQL_INTERVAL_HOUR_TO_SECOND/ SQL_C_INTERVAL_HOUR_TO_SECOND SQL_CODE_HOUR_TO_SECOND
SQL_INTERVAL_MINUTE/ SQL_C_INTERVAL_MINUTE SQL_CODE_MINUTE
SQL_INTERVAL_MINUTE_TO_SECOND/ SQL_C_INTERVAL_MINUTE_TO_SECOND SQL_CODE_MINUTE_TO_SECOND
SQL_INTERVAL_MONTH/ SQL_C_INTERVAL_MONTH SQL_CODE_MONTH
SQL_INTERVAL_SECOND/ SQL_C_INTERVAL_SECOND SQL_CODE_SECOND
SQL_INTERVAL_YEAR/ SQL_C_INTERVAL_YEAR SQL_CODE_YEAR
SQL_INTERVAL_YEAR_TO_MONTH/ SQL_C_INTERVAL_YEAR_TO_MONTH SQL_CODE_YEAR_TO_MONTH

Для получения дополнительной информации о интервалах данных и этом поле см. раздел «Идентификаторы и дескрипторы типов данных».

SQL_DESC_DATETIME_INTERVAL_PRECISION [Все]
Это поле записи SQLINTEGER содержит интервальную точность лидера, если поле SQL_DESC_TYPE SQL_INTERVAL. Когда поле SQL_DESC_DATETIME_INTERVAL_CODE устанавливается на тип интервальных данных, это поле устанавливается с точностью по умолчанию с интервалом ведущей.

SQL_DESC_DISPLAY_SIZE [IRD]
Это поле записи SQLINTEGER только для чтения содержит максимальное количество символов, необходимых для отображения данных из столбца.

SQL_DESC_FIXED_PREC_SCALE [Дескрипторы реализации]
Это поле записи SQLSMALLINT только для чтения устанавливается на SQL_TRUE, если столбец является точным числовым столбцем с фиксированной точностью и ненулевой масштабом, или SQL_FALSE, если столбец не является точным числовым столбцем с фиксированной точностью и масштабом.

SQL_DESC_INDICATOR_PTR [Дескрипторы приложений]
В ARD это поле записи SQLLEN * указывает на индикаторную переменную. Эта переменная содержит SQL_NULL_DATA, если значение столбца равно NULL. Для APD индикаторная переменная устанавливается в SQL_NULL_DATA для указания NULL динамических аргументов. В противном случае переменная равна нулю (если значения в SQL_DESC_INDICATOR_PTR и SQL_DESC_OCTET_LENGTH_PTR не совпадают с одним указателем).

Если поле SQL_DESC_INDICATOR_PTR в ARD является нулевым указателем, драйвер не может вернуть информацию о том, является ли столбец NULL или нет. Если столбец — NULL, а SQL_DESC_INDICATOR_PTR — нулевой указатель, SQLSTATE 22002 (Indicator variable required, но не предоставляется) возвращается, когда драйвер пытается заполнить буфер после вызова SQLFetch или SQLFetchScroll. Если вызов SQLFetch или SQLFetchScroll не возвращал SQL_SUCCESS или SQL_SUCCESS_WITH_INFO, содержимое буфера не определено.

Поле SQL_DESC_INDICATOR_PTR определяет, установлено ли поле, на которое указывает SQL_DESC_OCTET_LENGTH_PTR. Если значение данных для столбца равно NULL, драйвер устанавливает индикаторную переменную в SQL_NULL_DATA. Поле, на которое указывает SQL_DESC_OCTET_LENGTH_PTR, тогда не устанавливается. Если при извлечении значения NULL не встречается, буфер, на который указывает SQL_DESC_INDICATOR_PTR, устанавливается на ноль, а буфер, на который указывает SQL_DESC_OCTET_LENGTH_PTR, — на длину данных.

Если поле SQL_DESC_INDICATOR_PTR в APD является null-указателем, приложение не может использовать эту запись дескриптора для указания NULL аргументов.

Это поле является отложенным полем: оно не используется в момент установки, а позже используется драйвером для обозначения нулевости (для ARD) или для определения нулевости (для APD).

SQL_DESC_LABEL [ИРД]
Это поле записи SQLCHAR * только для чтения содержит метку или заголовок столбца. Если столбец не имеет метки, эта переменная содержит имя столбца. Если столбец не имеет имени и не имеет меток, эта переменная содержит пустую строку.

SQL_DESC_LENGTH [Все]
Это поле записи SQLULEN — это либо максимальная, либо фактическая длина строки символа в символах, либо бинарный тип данных в байтах. Это максимальная длина для типа данных с фиксированной длиной или фактическая длина для типа данных с переменной длиной. Его значение всегда исключает символ нулевой терминации, заканчивающий строку символа. Для значений, типы которых — SQL_TYPE_DATE, SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP или один из типов данных интервала SQL, это поле имеет длину в символах значения значения datetime или interval в символах.

Значение в этом поле может отличаться от значения «длины», определённого в ODBC 2*.x*. Для получения дополнительной информации см. Приложение D: Типы данных.

SQL_DESC_LITERAL_PREFIX [ИРД]
Это поле записи SQLCHAR * только для чтения содержит символ или символы, которые драйвер распознаёт как префикс для литерала этого типа данных. Эта переменная содержит пустую строку для типа данных, для которого не применим литеральный префикс.

SQL_DESC_LITERAL_SUFFIX [IRD]
Это поле записи SQLCHAR * только для чтения содержит символ или символы, которые драйвер распознаёт как суффикс для литерала этого типа данных. Эта переменная содержит пустую строку для типа данных, для которого литеральный суффикс не применим.

SQL_DESC_LOCAL_TYPE_NAME [Дескрипторы реализации]
Это поле записи SQLCHAR * только для чтения содержит любое локализованное (на родном языке) имя типа данных, которое может отличаться от обычного названия типа данных. Если локализованного имени нет, возвращается пустая строка. Это поле предназначено только для отображения.

SQL_DESC_NAME [Дескрипторы реализации]
Это поле записи SQLCHAR * в дескрипторе строки содержит псевдоним столбца, если он применим. Если псевдоним столбца не применяется, имя столбца возвращается. В любом случае драйвер устанавливает поле SQL_DESC_UNNAMED в SQL_NAMED, когда устанавливает поле SQL_DESC_NAME. Если нет названия столбца или псевдонима столбца, драйвер возвращает пустую строку в поле SQL_DESC_NAME и устанавливает поле SQL_DESC_UNNAMED в SQL_UNNAMED.

Приложение может установить поле SQL_DESC_NAME IPD на имя параметра или псевдоним, чтобы задать хранимые параметры процедуры по имени. (Для получения дополнительной информации см. раздел «Параметры привязки по названию (именованные параметры).) SQL_DESC_NAME поле IRD — это поле только для чтения; SQLSTATE HY091 (идентификатор поля недействительного дескриптора) будет возвращен, если приложение попытается его установить.

В IPD это поле неопределено, если драйвер не поддерживает именованные параметры. Если драйвер поддерживает именованные параметры и способен описывать параметры, имя параметра возвращается в этом поле.

SQL_DESC_NULLABLE [Дескрипторы реализации]
В IRD это поле записи SQLSMALLINT только для чтения SQL_NULLABLE, если столбец может содержать значения NULL, SQL_NO_NULLS если столбец не содержит значений NULL, или SQL_NULLABLE_UNKNOWN, если неизвестно, принимает ли столбец значения NULL. Это поле относится к столбцу набора результатов, а не к базовому столбцу.

В IPD это поле всегда устанавливается в SQL_NULLABLE, поскольку динамические параметры всегда обнулены и не могут быть зададены приложением.

SQL_DESC_NUM_PREC_RADIX [Все]
Это поле SQLINTEGER содержит значение 2, если тип данных в поле SQL_DESC_TYPE является приблизительным числовым типом данных, поскольку поле SQL_DESC_PRECISION содержит количество бит. Это поле содержит значение 10, если тип данных в поле SQL_DESC_TYPE является точным числовым типом данных, поскольку поле SQL_DESC_PRECISION содержит количество десятичных цифр. Это поле установлено в 0 для всех нечисловых типов данных.

SQL_DESC_OCTET_LENGTH [Все]
Это поле записи SQLLEN содержит длину в байтах строки символа или бинарного типа данных. Для типов символов фиксированной длины или двоичных типов это фактическая длина в байтах. Для типов символов или двоичных типов переменной длины это максимальная длина в байтах. Это значение всегда исключает пространство для символа нулевой терминации для дескрипторов реализации и всегда включает место для символа нулевой терминации для дескрипторов приложений. Для данных приложений это поле содержит размер буфера. Для APD это поле определяется только для параметров выхода или входа/выхода.

SQL_DESC_OCTET_LENGTH_PTR [Дескрипторы приложений]
Это поле записи SQLLEN * указывает на переменную, которая будет содержать общую длину в байтах динамического аргумента (для дескрипторов параметров) или значения связанного столбца (для дескрипторов строк).

Для APD это значение игнорируется для всех аргументов, кроме строки символов и бинарной системы; Если это поле указывает на SQL_NTS, динамический аргумент должен быть нулевой терминирован. Чтобы указать, что связанный параметр будет параметром данных при выполнении, приложение устанавливает это поле в соответствующей записи APD в переменную, которая при выполнении будет содержать значение SQL_DATA_AT_EXEC или результат макроса SQL_LEN_DATA_AT_EXEC. Если таких полей несколько, SQL_DESC_DATA_PTR можно установить на значение, уникально идентифицирующее параметр, чтобы помочь приложению определить, какой параметр запрашивается.

Если OCTET_LENGTH_PTR поле ARD является нулевым указателем, драйвер не возвращает информацию о длине столбца. Если SQL_DESC_OCTET_LENGTH_PTR поле APD является нулевым указателем, драйвер предполагает, что строки символов и бинарные значения являются нулевыми терминами. (Бинарные значения не должны быть нулевыми терминированными, но им следует присваивать длину, чтобы избежать усечения.)

Если вызов SQLFetch или SQLFetchScroll , заполняющий буфер, указанный этим полем, не возвращал SQL_SUCCESS или SQL_SUCCESS_WITH_INFO, содержимое буфера не определёно. Это поле является отложенным. Он не используется в момент установки, а позже используется драйвером для определения или указания длины октета данных.

SQL_DESC_PARAMETER_TYPE [IPD]
Это поле записи SQLSMALLINT устанавливается на SQL_PARAM_INPUT для входного параметра, SQL_PARAM_INPUT_OUTPUT для входного/выходного параметра, SQL_PARAM_OUTPUT для выходного параметра, SQL_PARAM_INPUT_OUTPUT_STREAM для входно-выходного потокового параметра или SQL_PARAM_OUTPUT_STREAM для выходного потокового параметра. По умолчанию он настроен на SQL_PARAM_INPUT.

Для IPD поле по умолчанию установлено на SQL_PARAM_INPUT, если драйвер не заполняется автоматически (атрибут оператора SQL_ATTR_ENABLE_AUTO_IPD — SQL_FALSE). Приложение должно установить это поле в IPD для параметров, которые не являются входными параметрами.

SQL_DESC_PRECISION [Все]
Это поле записи SQLSMALLINT содержит количество цифр для точного числового типа, количество бит в мантиссе (бинарной точности) для приблизительного числового типа или количество цифр в компоненте дробных секунд для SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP или SQL_INTERVAL_SECOND типа данных. Это поле не определено для всех остальных типов данных.

Значение в этом поле может отличаться от значения «точности», определённого в ODBC 2*.x*. Для получения дополнительной информации см. Приложение D: Типы данных.

SQL_DESC_ROWVER [Дескрипторы реализации]
Это поле SQLSMALLINTrecord показывает, изменяется ли столбец автоматически СУБД при обновлении строки (например, столбец типа «timestamp» в SQL Server). Значение этого поля записи устанавливается как SQL_TRUE, если столбец является столбцем версии строки, и SQL_FALSE в противном случае. Этот атрибут столбца похож на вызов SQLSpecialColumns с IdentifierType SQL_ROWVER для определения автоматического обновления столбца.

SQL_DESC_SCALE [Все]
Это поле записи SQLSMALLINT содержит определённый масштаб для десятичных и числовых типов данных. Это поле не определено для всех остальных типов данных.

Значение в этом поле может отличаться от значения «масштаба», определённого в ODBC 2*.x*. Для получения дополнительной информации см. Приложение D: Типы данных.

SQL_DESC_SCHEMA_NAME [IRDs]
Это поле записи SQLCHAR * только для чтения содержит имя схемы базовой таблицы, содержащей столбец. Возвращаемое значение зависит от драйвера, является ли столбец выражением или если столбец является частью представления. Если источник данных не поддерживает схемы или имя схемы невозможно определить, эта переменная содержит пустую строку.

SQL_DESC_SEARCHABLE [ИРД]
Это поле записи SQLSMALLINT только для чтения устанавливается на одно из следующих значений:

  • SQL_PRED_NONE, если столбец не может быть использован в клаузе WHERE . (Это то же самое, что и SQL_UNSEARCHABLE в ODBC 2*.x*.)

  • SQL_PRED_CHAR можно ли использовать столбец в клаузе WHERE , но только с предикатом LIKE . (Это то же самое, что и SQL_LIKE_ONLY в ODBC 2*.x*.)

  • SQL_PRED_BASIC можно ли использовать столбец в WHERE clause со всеми операторами сравнения, кроме LIKE. (Это то же самое, что и SQL_EXCEPT_LIKE в ODBC 2*.x*.)

  • SQL_PRED_SEARCHABLE можно ли использовать столбец в WHERE clause с любым оператором сравнения.

SQL_DESC_TABLE_NAME [IRD]
Это поле записи SQLCHAR * только для чтения содержит название базовой таблицы, содержащей этот столбец. Возвращаемое значение зависит от драйвера, является ли столбец выражением или если столбец является частью представления.

SQL_DESC_TYPE [Все]
Это поле записи SQLSMALLINT определяет краткий тип данных SQL или C для всех типов данных, кроме типов данных datetime и interval data. Для типов данных datetime и interval это поле задаёт многословный тип данных, который равен SQL_DATETIME или SQL_INTERVAL.

Всякий раз, когда это поле содержит SQL_DATETIME или SQL_INTERVAL, поле SQL_DESC_DATETIME_INTERVAL_CODE должно содержать соответствующий подкод для лаконичного типа. Для типов данных времени времени SQL_DESC_TYPE содержит SQL_DATETIME, а поле SQL_DESC_DATETIME_INTERVAL_CODE содержит подкод для конкретного типа данных времени даты. Для интервальных типов данных SQL_DESC_TYPE содержит SQL_INTERVAL, а поле SQL_DESC_DATETIME_INTERVAL_CODE содержит подкод для конкретного типа интервальных данных.

Значения в полях SQL_DESC_TYPE и SQL_DESC_CONCISE_TYPE взаимозависимы. Каждый раз, когда одно из полей устанавливается, должно быть установлено и другое. SQL_DESC_TYPE можно задать вызовом SQLSetDescField или SQLSetDescRec. SQL_DESC_CONCISE_TYPE можно задать вызовом SQLBindCol или SQLBindParameter, или SQLSetDescField.

Если SQL_DESC_TYPE установлен на краткий тип данных, отличный от интервала или типа времени времени, поле SQL_DESC_CONCISE_TYPE устанавливается на то же значение, а поле SQL_DESC_DATETIME_INTERVAL_CODE — в 0.

Если SQL_DESC_TYPE установлен на подробный тип данных datetime или interval (SQL_DATETIME или SQL_INTERVAL), а поле SQL_DESC_DATETIME_INTERVAL_CODE установить соответствующий подкод, поле SQL_DESC_CONCISE TYPE устанавливается на соответствующий лаконичный тип. Попытка установить SQL_DESC_TYPE на один из лаконичных типов времени или интервалов вернёт SQLSTATE HY021 (Несогласованная информация о описании).

Когда поле SQL_DESC_TYPE задаётся вызовом SQLBindCol, SQLBindParameter или SQLSetDescField, следующие поля устанавливаются на следующие значения по умолчанию, как показано в таблице ниже. Значения оставшихся полей той же записи не определены.

Ценность SQL_DESC_TYPE Другие поля, неявно установленные
SQL_CHAR, SQL_VARCHAR, SQL_C_CHAR, SQL_C_VARCHAR SQL_DESC_LENGTH установлено на 1. SQL_DESC_PRECISION установлен в 0.
SQL_DATETIME Когда SQL_DESC_DATETIME_INTERVAL_CODE установлен на SQL_CODE_DATE или SQL_CODE_TIME, SQL_DESC_PRECISION устанавливается в 0. Когда он установлен на SQL_DESC_TIMESTAMP, SQL_DESC_PRECISION ставится на 6.
SQL_DECIMAL, SQL_NUMERIC, SQL_C_NUMERIC SQL_DESC_SCALE установлен на 0. SQL_DESC_PRECISION устанавливается на точность, определённую реализацией для соответствующего типа данных.

См. SQL to C: Numeric для информации о том, как вручную привязать SQL_C_NUMERIC значение.
SQL_FLOAT, SQL_C_FLOAT SQL_DESC_PRECISION устанавливается на стандартную точность, определённую реализацией для SQL_FLOAT.
SQL_INTERVAL Когда SQL_DESC_DATETIME_INTERVAL_CODE установлен на интервальный тип данных, SQL_DESC_DATETIME_INTERVAL_PRECISION устанавливается в 2 (стандартная точность, ведущая интервал). Когда интервал содержит компоненту секунд, SQL_DESC_PRECISION устанавливается на 6 (стандартная точность интервала секунд).

Когда приложение вызывает SQLSetDescField для задания полей дескриптора вместо вызова SQLSetDescRec, оно должно сначала объявить тип данных. Когда это происходит, другие поля, указанные в предыдущей таблице, неявно устанавливаются. Если любое из неявно заданных значений недопустимо, приложение может вызвать SQLSetDescField или SQLSetDescRec для явной установки недопустимого значения.

SQL_DESC_TYPE_NAME [Дескрипторы реализации]
Это поле записи SQLCHAR * только для чтения содержит имя типа, зависящее от источника данных (например, «CHAR», «VARCHAR» и т.д.). Если имя типа данных неизвестно, эта переменная содержит пустую строку.

SQL_DESC_UNNAMED [Дескрипторы реализации]
Это поле записи SQLSMALLINT в строке задаётся драйвером как SQL_NAMED или SQL_UNNAMED при установке поля SQL_DESC_NAME. Если поле SQL_DESC_NAME содержит псевдоним столбца или если псевдоним столбца не применяется, драйвер устанавливает поле SQL_DESC_UNNAMED в SQL_NAMED. Если приложение устанавливает поле SQL_DESC_NAME IPD на имя параметра или псевдоним, драйвер устанавливает поле SQL_DESC_UNNAMED IPD в SQL_NAMED. Если нет названия столбца или псевдонима столбца, драйвер устанавливает поле SQL_DESC_UNNAMED в SQL_UNNAMED.

Приложение может установить SQL_DESC_UNNAMED поле IPD в SQL_UNNAMED. Драйвер возвращает SQLSTATE HY091 (идентификатор поля недействительного дескриптора), если приложение пытается установить SQL_DESC_UNNAMED поле IPD в SQL_NAMED. SQL_DESC_UNNAMED поле IRD является только для чтения; SQLSTATE HY091 (идентификатор поля недействительного дескриптора) будет возвращен, если приложение попытается его установить.

SQL_DESC_UNSIGNED [Дескрипторы реализации]
Это поле записи SQLSMALLINT только для чтения устанавливается на SQL_TRUE, если тип столбца беззнаковый или нечисловый, либо SQL_FALSE, если тип столбца подписан.

SQL_DESC_UPDATABLE [IRDs]
Это поле записи SQLSMALLINT только для чтения устанавливается на одно из следующих значений:

  • SQL_ATTR_READ_ONLY если столбец результатов является только для чтения.

  • SQL_ATTR_WRITE если столбец результатов — это чтение-запись.

  • SQL_ATTR_READWRITE_UNKNOWN если неизвестно, можно ли обновить столбец результатов или нет.

SQL_DESC_UPDATABLE описывает возможность обновления столбца в наборе результатов, а не столбца в базовой таблице. Обновление столбца в базовой таблице, на которой основан столбец этого набора результатов, может отличаться от значения в данном поле. Возможность обновления столбца может зависеть от типа данных, пользовательских прав и определения самого набора результатов. Если неясно, можно ли обновить колонку, SQL_ATTR_READWRITE_UNKNOWN следует вернуть.

Проверки согласованности

Проверка согласованности выполняется драйвером автоматически, когда приложение передаёт значение для SQL_DESC_DATA_PTR поля ARD, APD или IPD. Если какое-либо из полей противоречит другим полям, SQLSetDescField вернёт SQLSTATE HY021 (Несогласованная информация о дескрипте). Для получения дополнительной информации см. раздел «Проверка согласованности» в SQLSetDescRec.

Тема Смотри
Переплетывание колонны Функция SQLBindCol
Связывание параметра Параметрическая функция SQLBindParameter
Получение дескрипторного поля Функция SQLGetDescField
Получение нескольких дескрипторных полей Функция SQLGetDescRec
Установка нескольких полей дескрипторов Функция SQLSetDescRec

См. также

Файлы заголовков ODBC
Справочник по API ODBC