将数据从 SQL 转换为 C 数据类型

当应用程序调用 SQLFetch、SQLFetchScrollSQLGetData 时,驱动程序将从数据源中检索数据。 如有必要,它会将数据从驱动程序检索到 SQLBindCol 或 SQLGetData 中 TargetType 参数指定的数据类型转换为数据类型。最后,它将数据存储在 SQLBindColSQLGetDataTargetValuePtr 参数指向的位置(以及 ARD 的SQL_DESC_DATA_PTR字段)。

下表显示了从 ODBC SQL 数据类型到 ODBC C 数据类型支持的转换。 填充圆表示 SQL 数据类型的默认转换(当 TargetType 的值SQL_C_DEFAULT时,数据将转换为的 C 数据类型)。 空心圆表示支持的转换。

对于使用 ODBC 2.x 驱动程序的 ODBC 3.x 应用程序,可能不支持从特定于驱动程序的数据类型转换。

转换后的数据的格式不受 Windows 国家/地区设置的影响。

以下部分中的表介绍了驱动程序或数据源如何转换从数据源检索到的数据;驱动程序需要支持从它们支持的 ODBC SQL 数据类型转换为所有 ODBC C 数据类型。 对于给定的 ODBC SQL 数据类型,表的第一列列出了 SQLBindCol 和 SQLGetDataTargetType 参数的法律输入值。 第二列列出测试的结果,通常使用 SQLBindColSQLGetData 中指定的 BufferLength 参数,驱动程序会执行该参数来确定它是否可以转换数据。 对于每个结果,第三列和第四列列出了 TargetValuePtr 指定的缓冲区中放置的值,并在驱动程序尝试转换数据后StrLen_or_IndPtr SQLBindColSQLGetData 中指定的参数。 (The StrLen_or_IndPtr参数对应于 ARD 的SQL_DESC_OCTET_LENGTH_PTR字段。最后一列列出 SQLFetchSQLFetchScrollSQLGetData 为每个结果返回的 SQLSTATE。

如果 SQLBindColSQLGetData 中的 TargetType 参数包含给定 ODBC SQL 数据类型、SQLFetch、SQLFetchScrollSQLGetData 返回 SQLSTATE 07006(受限数据类型属性冲突)表中未显示的 ODBC C 数据类型的标识符。 如果 TargetType 参数包含一个标识符,该标识符指定从驱动程序特定的 SQL 数据类型到 ODBC C 数据类型的转换,并且驱动程序、SQLFetch、SQLFetchScrollSQLGetData 不支持此转换返回 SQLSTATE HYC00(未实现可选功能)。

尽管表中未显示该变量,但当 SQL 数据值为 NULL 时,驱动程序在StrLen_or_IndPtr参数指定的 缓冲区中返回SQL_NULL_DATA 。 有关在多次调用检索数据时使用 StrLen_or_IndPtr 的说明,请参阅 SQLGetData 函数说明。 当 SQL 数据转换为字符 C 数据时,*StrLen_or_IndPtr 中返回的字符计数不包括 null 终止字节。 如果 TargetValuePtr 是空指针,SQLGetData 将返回 SQLSTATE HY009(null 指针的用法无效);在 SQLBindCol,这会取消绑定列。

表中使用以下术语和约定:

  • 数据字节长度 是可用于在 *TargetValuePtr 中返回的 C 数据的字节数,无论数据在返回到应用程序之前是否将被截断。 对于字符串数据,这不包括 null 终止字符的空间。

  • 字符字节长度 是以字符格式显示数据所需的字节总数。 这在“显示大小”部分中为每个 C 数据类型定义,但显示大小为字符时,字符字节长度以字节为单位。

  • 斜体中的字词表示 SQL 语法的函数参数或元素。 有关语法元素的语法,请参阅 附录 C:SQL 语法

本部分包含以下主题。