Функция SQLColAttribute

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

Сводка
SQLColAttribute возвращает сведения дескриптора для столбца в результирующем наборе. Сведения дескриптора возвращаются как символьная строка, дескриптор-зависимый от дескриптора или целочисленное значение.

Заметка

Дополнительные сведения о том, с чем диспетчер драйверов сопоставляет эту функцию при использовании ODBC 3.Приложение x работает с ODBC 2.Драйвер x см. в разделе "Функции замены сопоставления" для обеспечения обратной совместимости приложений.

Синтаксис

  
SQLRETURN SQLColAttribute (  
      SQLHSTMT        StatementHandle,  
      SQLUSMALLINT    ColumnNumber,  
      SQLUSMALLINT    FieldIdentifier,  
      SQLPOINTER      CharacterAttributePtr,  
      SQLSMALLINT     BufferLength,  
      SQLSMALLINT *   StringLengthPtr,  
      SQLLEN *        NumericAttributePtr);  

Аргументы

ОператорHandle
[Входные данные] Дескриптор инструкции.

ColumnNumber
[Входные данные] Число записей в IRD, из которого извлекается значение поля. Этот аргумент соответствует количеству результирующих данных столбца, упорядоченным последовательно в порядке увеличения порядка столбцов, начиная с 1. Столбцы можно описать в любом порядке.

Столбец 0 можно указать в этом аргументе, но все значения, кроме SQL_DESC_TYPE и SQL_DESC_OCTET_LENGTH возвращают неопределенные значения.

FieldIdentifier
[Входные данные] Дескриптор. Этот дескриптор определяет, какое поле в IRD следует запрашивать (например, SQL_COLUMN_TABLE_NAME).

CharacterAttributePtr
[Выходные данные] Указатель на буфер, в котором возвращается значение в поле FieldIdentifier строки IRD columnNumber , если поле является символьной строкой. В противном случае поле не используется.

Если CharacterAttributePtr имеет значение NULL, StringLengthPtr по-прежнему возвращает общее количество байтов (за исключением символа завершения null для символьных данных), доступное для возврата в буфер, на который указывает CharacterAttributePtr.

BufferLength
[Входные данные] Если FieldIdentifier является полем, определяемым ODBC, и CharacterAttributePtr указывает на символьную строку или двоичный буфер, этот аргумент должен быть длиной *CharacterAttributePtr. Если FieldIdentifier является полем, определяемым ODBC, а *CharacterAttributePtr является целым числом, это поле игнорируется. Если аргумент *CharacterAttributePtr является строкой Юникода (при вызове SQLColAttributeW), аргумент BufferLength должен быть четным числом. Если FieldIdentifier является определяемым драйвером полем, приложение указывает характер поля диспетчеру драйверов, задав аргумент BufferLength . BufferLength может иметь следующие значения:

  • Если CharacterAttributePtr является указателем на указатель, BufferLength должен иметь значение SQL_IS_POINTER.

  • Если CharacterAttributePtr является указателем на строку символов, буферLength — это длина буфера.

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

  • Если CharacterAttributePtr является указателем на тип данных фиксированной длины, BufferLength должен быть одним из следующих: SQL_IS_INTEGER, SQL_IS_UINTEGER, SQL_IS_SMALLINT или SQL_IS_USMALLINT.

StringLengthPtr
[Выходные данные] Указатель на буфер, в котором возвращается общее количество байтов (за исключением байта завершения null для символьных данных), доступное для возврата в *CharacterAttributePtr.

Для символьных данных, если число байтов, доступных для возврата, больше или равно BufferLength, сведения дескриптора в *CharacterAttributePtr усечены до BufferLength минус длина символа завершения null и завершается драйвером null.

Для всех других типов данных значение BufferLength игнорируется, и драйвер предполагает, что размер *CharacterAttributePtr составляет 32 бита.

NumericAttributePtr
[Выходные данные] Указатель на целый буфер, в котором возвращается значение в поле FieldIdentifier строки ColumnNumber irD, если поле является числовым типом дескриптора, например SQL_DESC_COLUMN_LENGTH. В противном случае поле не используется. Обратите внимание, что некоторые драйверы могут записывать только более низкий 32-разрядный или 16-разрядный буфер и оставлять более высокий порядок без изменений. Поэтому приложения должны инициализировать значение до 0 перед вызовом этой функции.

Возвраты

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_STILL_EXECUTING, SQL_ERROR или SQL_INVALID_HANDLE.

Диагностика

Когда SQLColAttribute возвращает SQL_ERROR или SQL_SUCCESS_WITH_INFO, связанное значение SQLSTATE может быть получено путем вызова SQLGetDiagRec с handleType SQL_HANDLE_STMT и дескриптором инструкцииHandle. В следующей таблице перечислены значения SQLSTATE, часто возвращаемые SQLColAttribute , и объясняются каждый из них в контексте этой функции. Нотация "(DM)" предшествует описаниям SQLSTATEs, возвращаемых диспетчером драйверов. Возвращаемый код, связанный с каждым значением SQLSTATE, SQL_ERROR, если не указано иное.

SQLSTATE Error Description
01000 Общее предупреждение Информационное сообщение для конкретного драйвера. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
01004 Строковые данные, усеченные справа Буфер *CharacterAttributePtr не был достаточно большим, чтобы вернуть все строковое значение, поэтому строковое значение было усечено. Длина ненадежного строкового значения возвращается в *StringLengthPtr. (Функция возвращает SQL_SUCCESS_WITH_INFO.)
07005 Подготовленная инструкция не спецификация курсора Оператор, связанный с ОператоромHandle , не вернул результирующий набор и FieldIdentifier не был SQL_DESC_COUNT. Не было никаких столбцов, которые нужно описать.
07009 Недопустимый индекс дескриптора (DM) Значение, указанное для ColumnNumber , равно 0, и атрибут инструкции SQL_ATTR_USE_BOOKMARKS был SQL_UB_OFF.

Значение, указанное для аргумента ColumnNumber , больше количества столбцов в результирующем наборе.
HY000 Общая ошибка Произошла ошибка, для которой не было определенного SQLSTATE и для которого не было определено значение SQLSTATE для конкретной реализации. Сообщение об ошибке, возвращаемое SQLGetDiagField из структуры диагностических данных, описывает ошибку и ее причину.
HY001 Ошибка выделения памяти Драйверу не удалось выделить память, необходимую для поддержки выполнения или завершения функции.
HY008 Операция отменена Асинхронная обработка была включена для ОператораHandle. Функция была вызвана и до завершения выполнения, SQLCancel или SQLCancelHandle была вызвана на ОператорHandle. Затем функция снова была вызвана на ОператорHandle.

Функция была вызвана и до завершения выполнения SQLCancel или SQLCancelHandle была вызвана оператором StatementHandle из другого потока в многопотоковом приложении.
HY010 Ошибка последовательности функций (DM) Асинхронно выполняющаяся функция была вызвана для дескриптора соединения, связанного с ОператоромHandle. Эта анчхронная функция по-прежнему выполнялась при вызове SQLColAttribute.

(DM) SQLExecute, SQLExecDirect или SQLMoreResults был вызван для ОператораHandle и возвращен SQL_PARAM_DATA_AVAILABLE. Эта функция была вызвана до получения данных для всех потоковых параметров.

(DM) Функция была вызвана до вызова SQLPrepare, SQLExecDirect или функции каталога для StatementHandle.

(DM) асинхронно выполняющаяся функция (не эта) была вызвана для StatementHandle и по-прежнему выполнялась при вызове этой функции.

(DM) SQLExecute, SQLExecDirect, SQLBulkOperations или SQLSetPos были вызваны для ОператораHandle и возвращены SQL_NEED_DATA. Эта функция была вызвана до отправки данных для всех параметров выполнения или столбцов.
HY013 Ошибка управления памятью Не удалось обработать вызов функции, так как к базовым объектам памяти не удалось получить доступ, возможно, из-за низкой памяти.
HY090 Недопустимая длина строки или буфера (DM) *CharacterAttributePtr — это символьная строка, и BufferLength было меньше 0, но не равно SQL_NTS.
HY091 Недопустимый идентификатор поля дескриптора Значение, указанное для аргумента FieldIdentifier , не было одним из определенных значений и не было определяемым реализацией значением.
HY117 Подключение приостановлено из-за неизвестного состояния транзакции. Разрешены только функции отключения и только для чтения. (DM) Дополнительные сведения о приостановленном состоянии см. в статье SQLEndTran Function.
HYC00 Драйвер не поддерживается Значение, указанное для аргумента FieldIdentifier , не поддерживается драйвером.
HYT01 Время ожидания для подключения истекло Срок ожидания подключения истек до того, как источник данных ответил на запрос. Период времени ожидания подключения задается через SQLSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Драйвер не поддерживает эту функцию (DM) Драйвер, связанный с StatementHandle , не поддерживает функцию.
IM017 Опрос отключен в асинхронном режиме уведомлений При использовании модели уведомлений опрос отключается.
IM018 SQLCompleteAsync не был вызван для выполнения предыдущей асинхронной операции с этим дескриптором. Если предыдущий вызов функции дескриптора возвращает SQL_STILL_EXECUTING и если включен режим уведомлений, sqlCompleteAsync должен вызываться на дескрипторе для выполнения последующей обработки и завершения операции.

При вызове после SQLPrepare и до SQLExecute SQLColAttribute может возвращать любой SQLSTATE, который может быть возвращен SQLPrepare или SQLExecute, в зависимости от того, когда источник данных оценивает инструкцию SQL, связанную с Оператором StatementHandle.

По соображениям производительности приложение не должно вызывать SQLColAttribute перед выполнением инструкции.

Комментарии

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

SQLColAttribute возвращает сведения в *NumericAttributePtr или в *CharacterAttributePtr. Целочисленные сведения возвращаются в *NumericAttributePtr в качестве значения SQLLEN; все остальные форматы информации возвращаются в *CharacterAttributePtr. При возврате сведений в *NumericAttributePtr драйвер игнорирует CharacterAttributePtr, BufferLength и StringLengthPtr. Когда сведения возвращаются в *CharacterAttributePtr, драйвер игнорирует NumericAttributePtr.

SQLColAttribute возвращает значения из полей дескриптора IRD. Функция вызывается с дескриптором инструкции, а не дескриптором. Значения, возвращаемые SQLColAttribute для значений FieldIdentifier, перечисленных далее в этом разделе, также можно получить путем вызова SQLGetDescField с соответствующим дескриптором IRD.

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

ODBC 3.Драйвер x должен возвращать значение для каждого поля дескриптора. Если поле дескриптора не применяется к драйверу или источнику данных и если иное не указано, драйвер возвращает значение 0 в *StringLengthPtr или пустую строку в *CharacterAttributePtr.

Backward Compatibility

ODBC 3.Функция x SQLColAttribute заменяет устаревший ODBC 2.функция x SQLColAttributes. При сопоставлении SQLColAttributes с SQLColAttribute (при использовании ODBC 2.Приложение x работает с ODBC 3.x driver) или сопоставление SQLColAttribute с SQLColAttributes (когда ODBC 3.Приложение x работает с ODBC 2.x driver), диспетчер драйверов передает значение FieldIdentifier через, сопоставляет его с новым значением или возвращает ошибку следующим образом:

Заметка

Префикс, используемый в значениях FieldIdentifier в ODBC 3.x был изменен с того, что использовалось в ODBC 2.x. Новый префикс — "SQL_DESC"; Старый префикс был "SQL_COLUMN".

  • Значение #define ODBC 2.xFieldIdentifier совпадает со значением #define ODBC 3.xFieldIdentifier, значение в вызове функции только что передается.

  • Значения #define ODBC 2.XFieldIdentifiers SQL_COLUMN_LENGTH, SQL_COLUMN_PRECISION и SQL_COLUMN_SCALE отличаются от значений #define ODBC 3.xFieldIdentifiers SQL_DESC_PRECISION, SQL_DESC_SCALE и SQL_DESC_LENGTH. ODBC 2.Драйвер x должен поддерживать только ODBC 2.значения x . ODBC 3.Драйвер x должен поддерживать значения "SQL_COLUMN" и "SQL_DESC" для этих трех fieldIdentifiers. Эти значения отличаются, так как точность, масштабирование и длина определяются по-разному в ODBC 3.x , чем они были в ODBC 2.x. Дополнительные сведения см. в разделе "Размер столбца", "Десятичные цифры", " Длина октета" и "Размер отображения".

  • Значение #define ODBC 2.xFieldIdentifier отличается от значения #define ODBC 3.xFieldIdentifier, как происходит с значениями COUNT, NAME и NULLABLE, значение в вызове функции сопоставляется с соответствующим значением. Например, SQL_COLUMN_COUNT сопоставляется с SQL_DESC_COUNT, а SQL_DESC_COUNT сопоставляется с SQL_COLUMN_COUNT в зависимости от направления сопоставления.

  • Если FieldIdentifier является новым значением в ODBC 3.x, для которого в ODBC 2 не было соответствующего значения.x, он не будет сопоставлен при использовании ODBC 3.Приложение x использует его в вызове SQLColAttribute в ODBC 2.x driver, и вызов вернет SQLSTATE HY091 (недопустимый идентификатор поля дескриптора).

В следующей таблице перечислены типы дескриптора, возвращаемые SQLColAttribute. Тип для значений NumericAttributePtrSQLLEN *.

FieldIdentifier Сведения

возвращено в
Description
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) NumericAttributePtr SQL_TRUE, если столбец является автоматически добавочным столбцом.

SQL_FALSE, если столбец не является автоматическим или не числовым.

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

Когда вставка выполняется в столбец автоинкремента, уникальное значение вставляется в столбец во время вставки. Приращение не определено, но зависит от источника данных. Приложение не должно предполагать, что столбец автоматического увеличения начинается в любой точке или увеличивается по любому конкретному значению.
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) CharacterAttributePtr Имя базового столбца для столбца результирующих наборов. Если имя базового столбца не существует (как в случае столбцов, которые являются выражениями), эта переменная содержит пустую строку.

Эти сведения возвращаются из поля записи SQL_DESC_BASE_COLUMN_NAME IRD, которое является полем только для чтения.
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) CharacterAttributePtr Имя базовой таблицы, содержащей столбец. Если имя базовой таблицы не может быть определено или неприменимо, эта переменная содержит пустую строку.

Эти сведения возвращаются из поля записи SQL_DESC_BASE_TABLE_NAME IRD, которое является полем только для чтения.
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) NumericAttributePtr SQL_TRUE, если столбец учитывается как регистр для параметров сортировки и сравнения.

SQL_FALSE, если столбец не учитывается как регистр для параметров сортировки и сравнения или является нехарактерным.
SQL_DESC_CATALOG_NAME (ODBC 2.0) CharacterAttributePtr Каталог таблицы, содержащей столбец. Возвращаемое значение определяется реализацией, если столбец является выражением или если столбец является частью представления. Если источник данных не поддерживает каталоги или имя каталога невозможно определить, возвращается пустая строка. Это поле записи VARCHAR не ограничивается 128 символами.
SQL_DESC_CONCISE_TYPE (ODBC 1.0) NumericAttributePtr Краткий тип данных.

Для типов данных datetime и интервала это поле возвращает краткий тип данных; например, SQL_TYPE_TIME или SQL_INTERVAL_YEAR. (Дополнительные сведения см. в разделе Идентификаторы типов данных и дескрипторы в приложении D: Типы данных.)

Эти сведения возвращаются из поля записи SQL_DESC_CONCISE_TYPE IRD.
SQL_DESC_COUNT (ODBC 1.0) NumericAttributePtr Количество столбцов, доступных в результирующем наборе. При отсутствии столбцов в результирующем наборе возвращается значение 0. Значение в аргументе ColumnNumber игнорируется.

Эти сведения возвращаются из поля заголовка SQL_DESC_COUNT IRD.
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) NumericAttributePtr Максимальное количество символов, необходимых для отображения данных из столбца. Дополнительные сведения о размере отображения см. в разделе "Размер столбца", "Десятичные цифры", " Длина октета" и "Размер отображения" в приложении D: Типы данных.
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) NumericAttributePtr SQL_TRUE, если столбец имеет фиксированную точность и ненулевое масштабирование, относящиеся к источнику данных.

SQL_FALSE, если столбец не имеет фиксированной точности и ненулевого масштабирования, относящихся к источнику данных.
SQL_DESC_LABEL (ODBC 2.0) CharacterAttributePtr Метка столбца или название. Например, столбец с именем EmpName может быть помечен именем сотрудника или помечен псевдонимом.

Если столбец не имеет метки, возвращается имя столбца. Если столбец не помечен и не указан, возвращается пустая строка.
SQL_DESC_LENGTH (ODBC 3.0) NumericAttributePtr Числовое значение, которое является максимальной или фактической длиной символов строки символа или двоичного типа данных. Это максимальная длина символа для типа данных фиксированной длины или фактической длины символа для типа данных переменной длины. Его значение всегда исключает байт завершения NULL, заканчивающий строку символа.

Эти сведения возвращаются из поля записи SQL_DESC_LENGTH IRD.

Дополнительные сведения о длине см. в разделе "Размер столбца", "Десятичные цифры", " Длина октета" и "Размер отображения" в приложении D: Типы данных.
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) CharacterAttributePtr Это поле записи VARCHAR(128) содержит символ или символы, которые драйвер распознает как префикс для литерала этого типа данных. Это поле содержит пустую строку для типа данных, для которого не применяется префикс литерала. Дополнительные сведения см. в разделе "Префиксы литерала" и "Суффиксы".
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) CharacterAttributePtr Это поле записи VARCHAR(128) содержит символ или символы, которые драйвер распознает как суффикс для литерала этого типа данных. Это поле содержит пустую строку для типа данных, для которого не применяется литеральный суффикс. Дополнительные сведения см. в разделе "Префиксы литерала" и "Суффиксы".
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) CharacterAttributePtr Это поле записи VARCHAR(128) содержит любое локализованное (собственное язык) имя типа данных, которое может отличаться от обычного имени типа данных. Если локализованное имя отсутствует, возвращается пустая строка. Это поле предназначено только для отображения. Набор символов строки зависит от языкового стандарта и обычно является набором символов по умолчанию сервера.
SQL_DESC_NAME (ODBC 3.0) CharacterAttributePtr Псевдоним столбца, если он применяется. Если псевдоним столбца не применяется, возвращается имя столбца. В любом случае SQL_DESC_UNNAMED задано значение SQL_NAMED. Если нет имени столбца или псевдонима столбца, возвращается пустая строка и SQL_DESC_UNNAMED имеет значение SQL_UNNAMED.

Эти сведения возвращаются из поля записи SQL_DESC_NAME IRD.
SQL_DESC_NULLABLE (ODBC 3.0) NumericAttributePtr SQL_ NULLABLE, если столбец может иметь значения NULL; SQL_NO_NULLS, если столбец не имеет значений NULL; или SQL_NULLABLE_UNKNOWN, если столбец не принимает значения NULL.

Эти сведения возвращаются из поля записи SQL_DESC_NULLABLE IRD.
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) NumericAttributePtr Если тип данных в поле SQL_DESC_TYPE является приблизительным числовым типом данных, это поле SQLINTEGER содержит значение 2, так как поле SQL_DESC_PRECISION содержит количество битов. Если тип данных в поле SQL_DESC_TYPE является точным числовым типом данных, это поле содержит значение 10, так как поле SQL_DESC_PRECISION содержит число десятичных цифр. Это поле имеет значение 0 для всех нечисловых типов данных.
SQL_DESC_OCTET_LENGTH (ODBC 3.0) NumericAttributePtr Длина в байтах символьной строки или двоичного типа данных. Для символов фиксированной длины или двоичных типов это фактическая длина в байтах. Для символов переменной длины или двоичных типов это максимальная длина в байтах. Это значение не включает терминатор NULL.

Эти сведения возвращаются из поля записи SQL_DESC_OCTET_LENGTH IRD.

Дополнительные сведения о длине см. в разделе "Размер столбца", "Десятичные цифры", " Длина октета" и "Размер отображения" в приложении D: Типы данных.
SQL_DESC_PRECISION (ODBC 3.0) NumericAttributePtr Числовое значение, указывающее соответствующую точность для числового типа данных. Для типов данных SQL_TYPE_TIME, SQL_TYPE_TIMESTAMP и всех типов данных интервала, представляющих интервал времени, его значение является применимой точностью компонента дробных секунд.

Эти сведения возвращаются из поля записи SQL_DESC_PRECISION IRD.
SQL_DESC_SCALE (ODBC 3.0) NumericAttributePtr Числовое значение, которое является применимым масштабом для числового типа данных. Для типов данных DECIMAL и NUMERIC это определенный масштаб. Он не определен для всех других типов данных.

Эти сведения возвращаются из поля записи SCALE irD.
SQL_DESC_SCHEMA_NAME (ODBC 2.0) CharacterAttributePtr Схема таблицы, содержащей столбец. Возвращаемое значение определяется реализацией, если столбец является выражением или если столбец является частью представления. Если источник данных не поддерживает схемы или имя схемы невозможно определить, возвращается пустая строка. Это поле записи VARCHAR не ограничивается 128 символами.
SQL_DESC_SEARCHABLE (ODBC 1.0) NumericAttributePtr SQL_PRED_NONE, если столбец не может использоваться в предложении WHERE. (Это то же самое, что и значение SQL_UNSEARCHABLE в ODBC 2.x.)

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

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

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

Столбцы типа SQL_LONGVARCHAR и SQL_LONGVARBINARY обычно возвращают SQL_PRED_CHAR.
SQL_DESC_TABLE_NAME (ODBC 2.0) CharacterAttributePtr Имя таблицы, содержащей столбец. Возвращаемое значение определяется реализацией, если столбец является выражением или если столбец является частью представления.

Если имя таблицы невозможно определить, возвращается пустая строка.
SQL_DESC_TYPE (ODBC 3.0) NumericAttributePtr Числовое значение, указывающее тип данных SQL.

Если columnNumber равно 0, SQL_BINARY возвращается для закладок переменной длины и SQL_INTEGER возвращается для закладок фиксированной длины.

Для типов данных datetime и интервала это поле возвращает подробный тип данных: SQL_DATETIME или SQL_INTERVAL. (Дополнительные сведения см. в разделе Идентификаторы типов данных и дескрипторы в приложении D: типы данных.

Эти сведения возвращаются из поля записи SQL_DESC_TYPE IRD. Примечание. Для работы с ODBC 2.Драйверы x , вместо этого используйте SQL_DESC_CONCISE_TYPE.
SQL_DESC_TYPE_NAME (ODBC 1.0) CharacterAttributePtr Имя типа данных, зависящей от источника данных; например, CHAR, VARCHAR, MONEY, LONG VARBINARY или CHAR () FOR BIT DATA.

Если тип неизвестен, возвращается пустая строка.
SQL_DESC_UNNAMED (ODBC 3.0) NumericAttributePtr SQL_NAMED или SQL_UNNAMED. Если поле SQL_DESC_NAME IRD содержит псевдоним столбца или имя столбца, возвращается SQL_NAMED. Если нет псевдонима столбца или столбца, возвращается SQL_UNNAMED.

Эти сведения возвращаются из поля записи SQL_DESC_UNNAMED IRD.
SQL_DESC_UNSIGNED (ODBC 1.0) NumericAttributePtr SQL_TRUE, если столбец не назначен (или не числовый).

SQL_FALSE, если столбец подписан.
SQL_DESC_UPDATABLE (ODBC 1.0) NumericAttributePtr Столбец описывается значениями определенных констант:

SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN

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

SQLColAttribute — это расширяемая альтернатива SQLDescribeCol. SQLDescribeCol возвращает фиксированный набор сведений дескриптора на основе ANSI-89 SQL. SQLColAttribute позволяет получить доступ к более обширному набору сведений о дескрипторе, доступных в расширениях поставщика СУБД ANSI SQL-92 и СУБД.

Сведения Раздел
Привязка буфера к столбцу в результирующем наборе Функция SQLBindCol
Отмена обработки инструкций Функция SQLCancel
Возврат сведений о столбце в результирующем наборе Функция SQLDescribeCol
Получение блока данных или прокрутка результирующий набор Функция SQLFetchScroll
Получение нескольких строк данных Функция SQLFetch

пример

Следующий пример кода не освобождает дескриптора и подключения. Ознакомьтесь с функцией SQLFreeHandle, примером программы ODBC и функцией SQLFreeStmt для получения примеров кода для освобождения дескрипторов и инструкций.

// SQLColAttibute.cpp  
// compile with: user32.lib odbc32.lib  
  
#define UNICODE  
  
#include <windows.h>  
#include <sqlext.h>  
#include <strsafe.h>  
  
struct DataBinding {  
   SQLSMALLINT TargetType;  
   SQLPOINTER TargetValuePtr;  
   SQLINTEGER BufferLength;  
   SQLLEN StrLen_or_Ind;  
};  
  
void printStatementResult(SQLHSTMT hstmt) {  
   int bufferSize = 1024, i;  
   SQLRETURN retCode;  
   SQLSMALLINT numColumn = 0, bufferLenUsed;
   
   retCode = SQLNumResultCols(hstmt, &numColumn);  
   
   SQLPOINTER* columnLabels = (SQLPOINTER *)malloc( numColumn * sizeof(SQLPOINTER*) );  
   struct DataBinding* columnData = (struct DataBinding*)malloc( numColumn * sizeof(struct DataBinding) );  
  
   printf( "Columns from that table:\n" );  
   for ( i = 0 ; i < numColumn ; i++ ) {  
      columnLabels[i] = (SQLPOINTER)malloc( bufferSize*sizeof(char) );  
  
      retCode = SQLColAttribute(hstmt, (SQLUSMALLINT)i + 1, SQL_DESC_LABEL, columnLabels[i], (SQLSMALLINT)bufferSize, &bufferLenUsed, NULL);  
      wprintf( L"Column %d: %s\n", i, (wchar_t*)columnLabels[i] );  
   }  
  
   // allocate memory for the binding  
   for ( i = 0 ; i < numColumn ; i++ ) {  
      columnData[i].TargetType = SQL_C_CHAR;  
      columnData[i].BufferLength = (bufferSize+1);  
      columnData[i].TargetValuePtr = malloc( sizeof(unsigned char)*columnData[i].BufferLength );  
   }  
  
   // setup the binding   
   for ( i = 0 ; i < numColumn ; i++ ) {  
      retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, columnData[i].TargetType,   
         columnData[i].TargetValuePtr, columnData[i].BufferLength, &(columnData[i].StrLen_or_Ind));  
   }  
  
   printf( "Data from that table:\n" );  
   // fetch the data and print out the data  
   for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt) ) {  
      int j;  
      for ( j = 0 ; j < numColumn ; j++ )  
         wprintf( L"%s: %hs\n", columnLabels[j], columnData[j].TargetValuePtr );  
      printf( "\n" );  
   }  
   printf( "\n" );   
}  
  
int main() {  
   int bufferSize = 1024, i, count = 1, numCols = 5;  
   wchar_t firstTableName[1024], * dbName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize ), * userName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );  
   HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
   SQLWCHAR connStrbuffer[1024];  
   SQLSMALLINT connStrBufferLen, bufferLen;  
   SQLRETURN retCode;  
  
   SQLHENV henv = NULL;   // Environment     
   SQLHDBC hdbc = NULL;   // Connection handle  
   SQLHSTMT hstmt = NULL;   // Statement handle  
  
   struct DataBinding* catalogResult = (struct DataBinding*) malloc( numCols * sizeof(struct DataBinding) );  
   SQLWCHAR* selectAllQuery = (SQLWCHAR *)malloc( sizeof(SQLWCHAR) * bufferSize );  
  
   // connect to database  
   retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLCHAR *)(void*)SQL_OV_ODBC3, -1);  
   retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  
   retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);  
   retCode = SQLDriverConnect(hdbc, desktopHandle, L"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_PROMPT);  
   retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   // display the database information  
   retCode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, dbName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferLen);  
   retCode = SQLGetInfo(hdbc, SQL_USER_NAME, userName, (SQLSMALLINT)bufferSize, &bufferLen);  
  
   for ( i = 0 ; i < numCols ; i++ ) {  
      catalogResult[i].TargetType = SQL_C_CHAR;  
      catalogResult[i].BufferLength = (bufferSize + 1);  
      catalogResult[i].TargetValuePtr = malloc( sizeof(unsigned char)*catalogResult[i].BufferLength );  
   }  
  
   // Set up the binding. This can be used even if the statement is closed by closeStatementHandle  
   for ( i = 0 ; i < numCols ; i++ )  
      retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, catalogResult[i].TargetType, catalogResult[i].TargetValuePtr, catalogResult[i].BufferLength, &(catalogResult[i].StrLen_or_Ind));  
  
   retCode = SQLTables( hstmt, (SQLWCHAR*)SQL_ALL_CATALOGS, SQL_NTS, L"", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS );  
   retCode = SQLFreeStmt(hstmt, SQL_CLOSE);  
  
   retCode = SQLTables( hstmt, dbName, SQL_NTS, userName, SQL_NTS, L"%", SQL_NTS, L"TABLE", SQL_NTS );  
  
   for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt), ++count )  
      if ( count == 1 )  
         StringCchPrintfW( firstTableName, 1024, L"%hs", catalogResult[2].TargetValuePtr );  
   retCode = SQLFreeStmt(hstmt, SQL_CLOSE);  
  
   wprintf( L"Select all data from the first table (%s)\n", firstTableName );  
   StringCchPrintfW( selectAllQuery, bufferSize, L"SELECT * FROM %s", firstTableName );  
  
   retCode = SQLExecDirect(hstmt, selectAllQuery, SQL_NTS);  
   printStatementResult(hstmt);  
}  

См. также

Справочник по API ODBC
Файлы заголовков ODBC
Образец программы ODBC