Преобразование данных из SQL в типы данных C
Когда приложение вызывает SQLFetch, SQLFetchScroll или SQLGetData, драйвер извлекает данные из источника данных. При необходимости он преобразует данные из типа данных, в котором драйвер извлек его в тип данных, указанный аргументом TargetType в SQLBindCol или SQLGetData. Наконец, он сохраняет данные в расположении, на которое указывает аргумент TargetValuePtr в SQLBindCol или SQLGetData (и поле SQL_DESC_DATA_PTR ARD).
В следующей таблице показаны поддерживаемые преобразования типов данных ODBC SQL в типы данных ODBC C. Заполненный круг указывает преобразование по умолчанию для типа данных SQL (тип данных C, в который будут преобразованы данные, когда значение TargetType равно SQL_C_DEFAULT). Полый круг указывает на поддерживаемое преобразование.
Для приложения ODBC 3.x, работающего с драйвером ODBC 2.x, преобразование из типов данных для конкретного драйвера может не поддерживаться.
Формат преобразованных данных не влияет на параметр страны или региона Windows.
В таблицах в следующих разделах описывается, как драйвер или источник данных преобразует данные, полученные из источника данных; Драйверы необходимы для поддержки преобразований во все типы данных ODBC C из типов данных ODBC SQL, которые они поддерживают. Для заданного типа данных ODBC SQL первый столбец таблицы содержит юридические входные значения аргумента TargetType в SQLBindCol и SQLGetData. Второй столбец содержит результаты теста, часто используя аргумент BufferLength , указанный в SQLBindCol или SQLGetData, который драйвер выполняет, чтобы определить, может ли он преобразовать данные. Для каждого результата третий и четвертый столбцы перечисляют значения, помещенные в буферы, указанные аргументами TargetValuePtr и StrLen_or_IndPtr, указанными в SQLBindCol или SQLGetData после попытки драйвера преобразовать данные. (The StrLen_or_IndPtr аргумент соответствует полю SQL_DESC_OCTET_LENGTH_PTR ARD.) В последнем столбце перечислены значения SQLSTATE, возвращаемые для каждого результата SQLFetch, SQLFetchScroll или SQLGetData.
Если аргумент TargetType в SQLBindCol или SQLGetData содержит идентификатор типа данных ODBC C, который не отображается в таблице для заданного типа данных ODBC SQL, SQLFetch, SQLFetchScroll или SQLGetData возвращает SQLSTATE 07006 (нарушение атрибута ограниченного типа данных). Если аргумент TargetType содержит идентификатор, указывающий преобразование из типа данных SQL для конкретного драйвера в тип данных ODBC C, и это преобразование не поддерживается драйвером, SQLFetch, SQLFetchScroll или SQLGetData возвращает SQLSTATE HYC00 (необязательный компонент не реализован).
Хотя он не отображается в таблицах, драйвер возвращает SQL_NULL_DATA в буфере, указанном аргументом StrLen_or_IndPtr , если значение данных SQL равно NULL. Описание использования StrLen_or_IndPtr при получении данных несколькими вызовами см . в описании функции SQLGetData . При преобразовании данных SQL в символьные данные C число символов, возвращаемое в *StrLen_or_IndPtr , не включает байт завершения null. Если TargetValuePtr является пустым указателем, SQLGetData возвращает SQLSTATE HY009 (недопустимое использование указателя NULL); в SQLBindCol это отменяет привязку столбца.
В таблицах используются следующие термины и соглашения:
Длина байтов данных — это количество байтов данных C, доступных для возврата в *TargetValuePtr, независимо от того, будут ли данные усечены до возврата в приложение. Для строковых данных это не включает пробел для символа завершения null.
Длина байтов символов — это общее количество байтов, необходимых для отображения данных в формате символов. Это определяется для каждого типа данных C в разделе "Размер отображения", за исключением того, что длина байтов символов находится в байтах, а размер дисплея находится в символах.
Слова в курсиве представляют аргументы функций или элементы грамматики SQL. Синтаксис элементов грамматики см . в приложении C: Грамматика SQL.
Этот раздел содержит следующие подразделы.