SQLGetTypeInfo 函数

一致性
引入的版本:ODBC 1.0 标准符合性:ISO 92

总结
SQLGetTypeInfo 返回数据源支持的数据类型的相关信息。 驱动程序以 SQL 结果集的形式返回信息。 数据类型适用于数据定义语言 (DDL) 语句。

重要

应用程序必须使用 ALTER TABLE 和 CREATE TABLE 语句中 SQLGetTypeInfo 结果集TYPE_NAME列中返回的类型名称。 SQLGetTypeInfo 可能会返回DATA_TYPE列中具有相同值的多个行。

语法

  
SQLRETURN SQLGetTypeInfo(  
     SQLHSTMT      StatementHandle,  
     SQLSMALLINT   DataType);  

参数

StatementHandle
[输入]结果集的语句句柄。

DataType
[输入]SQL 数据类型。 这必须是附录 D:数据类型或特定于驱动程序的 SQL 数据类型部分中的值之一。 SQL_ALL_TYPES指定应返回有关所有数据类型的信息。

返回

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。

诊断

SQLGetTypeInfo 返回SQL_ERROR或SQL_SUCCESS_WITH_INFO时,可以通过使用 handleType of SQL_HANDLE_STMT 和 StatementHandle 句柄调用 SQLGetDiagRec 来获取关联的 SQLSTATE 值。 下表列出了 SQLGetTypeInfo 通常返回的 SQLSTATE 值,并解释此函数上下文中的每个值;表示法“(DM)”位于驱动程序管理器返回的 SQLSTATE 说明之前。 除非另有说明,否则与每个 SQLSTATE 值关联的返回代码SQL_ERROR。

SQLSTATE 错误 说明
01000 常规警告 特定于驱动程序的信息性消息。 (函数返回SQL_SUCCESS_WITH_INFO。)
01S02 选项值已更改 由于实现工作条件,指定的语句属性无效,因此暂时替换了类似的值。 (呼叫)用于确定临时替换值的 SQLGetStmtAttr。)替换值对 StatementHandle 有效,直到光标关闭为止。 可以更改的语句属性包括:SQL_ATTR_CONCURRENCY、SQL_ATTR_CURSOR_TYPE、SQL_ATTR_KEYSET_SIZE、SQL_ATTR_MAX_LENGTH、SQL_ATTR_MAX_ROWS、SQL_ATTR_QUERY_TIMEOUT 和SQL_ATTR_SIMULATE_CURSOR。 (函数返回SQL_SUCCESS_WITH_INFO。)
08S01 通信链接失败 驱动程序与驱动程序连接到的数据源之间的通信链接在函数完成处理之前失败。
24000 游标状态无效 在 StatementHandle 上 打开游标, 并且 已调用 SQLFetchSQLFetchScroll 。 如果 SQLFetch 或 SQLFetchScroll 未返回SQL_NO_DATA,并且如果 SQLFetchSQLFetchScroll 返回SQL_NO_DATA,驱动程序将返回此错误。

在 StatementHandle 上打开了结果集,但未调用 SQLFetchSQLFetchScroll
40001 序列化失败 由于资源死锁与另一个事务,事务已回滚。
40003 语句完成未知 执行此函数期间关联的连接失败,无法确定事务的状态。
HY000 常规错误 发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述错误及其原因。
HY001 内存分配错误 驱动程序无法分配支持执行或完成函数所需的内存。
HY004 SQL 数据类型无效 为参数 DataType 指定的值既不是有效的 ODBC SQL 数据类型标识符,也不是驱动程序支持的特定于驱动程序的数据类型标识符。
HY008 操作已取消 为 StatementHandle 启用了异步处理,然后调用了函数,在完成执行之前,对 StatementHandle 调用 SQLCancel 或 SQLCancelHandle 然后,在 StatementHandle再次调用该函数。

调用了该函数,在完成执行之前,SQLCancel 或 SQLCancelHandle 从多线程应用程序中的不同线程调用 StatementHandle
HY010 函数序列错误 (DM) 为与 StatementHandle 关联的连接句柄调用异步执行函数。 调用 SQLGetTypeInfo 函数时,此异步函数仍在执行。

(DM) 为 StatementHandle 调用了 SQLExecuteSQLExecDirectSQLMoreResults,并返回了SQL_PARAM_DATA_AVAILABLE。 在检索所有流式处理参数的数据之前调用此函数。

(DM) 为 StatementHandle 调用异步执行函数(而不是此函数),并在调用此函数时仍在执行。

(DM) 为 StatementHandle 调用了 SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos,并返回了SQL_NEED_DATA。 在为所有数据执行参数或列发送数据之前调用此函数。
HY013 内存管理错误 无法处理函数调用,因为基础内存对象无法访问,可能是因为内存条件低。
HY117 连接因未知事务状态而挂起。 仅允许断开连接和只读函数。 (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数
HYC00 未实现可选功能 驱动程序或数据源不支持SQL_ATTR_CONCURRENCY和SQL_ATTR_CURSOR_TYPE语句属性的当前设置的组合。

SQL_ATTR_USE_BOOKMARKS语句属性设置为SQL_UB_VARIABLE,SQL_ATTR_CURSOR_TYPE语句属性设置为驱动程序不支持书签的游标类型。
HYT00 已超时 在数据源返回结果集之前,查询超时期限已过期。 超时期限通过 SQLSetStmtAttr 设置,SQL_ATTR_QUERY_TIMEOUT。
HYT01 超过连接超时时间 在数据源响应请求之前,连接超时期限已过期。 连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驱动程序不支持此函数 (DM) 与 StatementHandle 对应的驱动程序不支持该函数。
IM017 在异步通知模式下禁用轮询 每当使用通知模型时,轮询将被禁用。
IM018 尚未调用 SQLCompleteAsync 来完成此句柄上的上一个异步操作。 如果句柄上的上一个函数调用返回SQL_STILL_EXECUTING并且启用通知模式, 则必须在句柄上调用 SQLCompleteAsync 才能执行后期处理并完成操作。

注释

SQLGetTypeInfo 以标准结果集的形式返回结果,按DATA_TYPE排序,然后按数据类型映射到相应的 ODBC SQL 数据类型的方式进行排序。 数据源定义的数据类型优先于用户定义的数据类型。 因此,排序顺序不一定是一致的,但可以先将排序顺序通用化为DATA_TYPE,后跟TYPE_NAME,这两者都是升序的。 例如,假设数据源定义了 INTEGER 和 COUNTER 数据类型,其中 COUNTER 是自动递增的,并且还定义了用户定义的数据类型 WHOLENUM。 这些值将按 INTEGER、WHOLENUM 和 COUNTER 的顺序返回,因为 WHOLENUM 与 ODBC SQL 数据类型SQL_INTEGER紧密映射,而自动递增数据类型(即使数据源支持)不会紧密映射到 ODBC SQL 数据类型。 有关如何使用此信息的信息,请参阅 DDL 语句

如果 DataType 参数指定一个数据类型,该数据类型对驱动程序支持的 ODBC 版本有效,但驱动程序不支持,则它将返回一个空的结果集。

注意

有关 ODBC 目录函数的常规用途、参数和返回数据的详细信息,请参阅 目录函数

已为 ODBC 3 重命名以下列。x. 列名更改不会影响向后兼容性,因为应用程序按列号绑定。

ODBC 2.0 列 ODBC 3.x
PRECISION COLUMN_SIZE
MONEY FIXED_PREC_SCALE
AUTO_INCREMENT AUTO_UNIQUE_VALUE

以下列已添加到 SQLGetTypeInfo for ODBC 3 返回的结果集中。x

  • SQL_DATA_TYPE

  • INTERVAL_PRECISION

  • SQL_DATETIME_SUB

  • NUM_PREC_RADIX

下表列出了结果集中的列。 驱动程序可以定义列 19 以外的其他列(INTERVAL_PRECISION)。 应用程序应从结果集末尾倒计时,而不是指定显式序号位置来访问特定于驱动程序的列。 有关详细信息,请参阅 目录函数返回的数据。

注意

SQLGetTypeInfo 可能不会返回所有数据类型。 例如,驱动程序可能不会返回用户定义的数据类型。 应用程序可以使用任何有效的数据类型,无论它是否由 SQLGetTypeInfo 返回。 SQLGetTypeInfo 返回的数据类型是数据源支持的数据类型。 它们用于数据定义语言(DDL)语句。 驱动程序可以使用 SQLGetTypeInfo 返回的类型以外的数据类型返回结果集数据。 在为目录函数创建结果集时,驱动程序可以使用数据源不支持的数据类型。

列名

数字
数据类型 备注
TYPE_NAME (ODBC 2.0) 1 Varchar 非 NULL 数据源依赖的数据类型名称;例如,“CHAR()”、“VARCHAR()”、“MONEY”、“LONG VARBINARY”或“CHAR()FOR BIT DATA”。 应用程序必须在 CREATE TABLE 和 ALTER TABLE 语句中使用此名称。
DATA_TYPE (ODBC 2.0) 2 Smallint(非 NULL) SQL 数据类型。 这可以是 ODBC SQL 数据类型或特定于驱动程序的 SQL 数据类型。 对于日期/时间或间隔数据类型,此列返回简洁的数据类型(如SQL_TYPE_TIME或SQL_INTERVAL_YEAR_TO_MONTH)。 有关有效 ODBC SQL 数据类型的列表,请参阅 附录 D 中的 SQL 数据类型 :数据类型。 有关特定于驱动程序的 SQL 数据类型的信息,请参阅驱动程序的文档。
COLUMN_SIZE (ODBC 2.0) 3 Integer 服务器支持此数据类型的最大列大小。 对于数值数据,这是最大精度。 对于字符串数据,这是长度(以字符为单位)。 对于日期/时间数据类型,这是字符串表示形式的长度(假设允许的小数秒部分的最大精度)。 对于列大小不适用的数据类型,返回 NULL。 对于间隔数据类型,这是间隔文本字符表示形式的字符数(由间隔前导精度定义;请参阅 附录 D:数据类型中的间隔数据类型长度 )。

有关列大小的详细信息,请参阅 “列大小”、“小数位数”、“传输八进制数长度”和“显示大小 ”(附录 D:数据类型)。
LITERAL_PREFIX (ODBC 2.0) 4 Varchar 用于为文本添加前缀的字符或字符;例如,字符数据类型的单引号(')或二进制数据类型的 0x;对于文本前缀不适用的数据类型,返回 NULL。
LITERAL_SUFFIX (ODBC 2.0) 5 Varchar 用于终止文本的字符或字符;例如,字符数据类型的单引号 (') ;对于文本后缀不适用的数据类型,返回 NULL。
CREATE_PARAMS (ODBC 2.0) 6 Varchar 使用TYPE_NAME字段中返回的名称时,应用程序可以在括号中指定的每个参数对应的关键字列表(用逗号分隔)。 列表中的关键字可以是以下任一项:长度、精度或小数位数。 它们按语法要求使用的顺序显示。 例如,DECIMAL 的CREATE_PARAMS为“precision,scale”;VARCHAR 的CREATE_PARAMS等于“length”。如果没有数据类型定义的参数,则返回 NULL;例如 INTEGER。

驱动程序以所用国家/地区的语言提供CREATE_PARAMS文本。
NULLABLE (ODBC 2.0) 7 Smallint(非 NULL) 数据类型是否接受 NULL 值:

如果数据类型不接受 NULL 值,SQL_NO_NULLS。

如果数据类型接受 NULL 值,则SQL_NULLABLE。

如果不知道列是否接受 NULL 值,则SQL_NULLABLE_UNKNOWN。
CASE_SENSITIVE (ODBC 2.0) 8 Smallint(非 NULL) 字符数据类型在排序规则和比较中是否区分大小写:

如果数据类型为字符数据类型且区分大小写,则SQL_TRUE。

如果数据类型不是字符数据类型或不区分大小写,则SQL_FALSE。
可搜索 (ODBC 2.0) 9 Smallint(非 NULL) 如何在 WHERE 子句中使用数据类型:

如果不能在 WHERE 子句中使用该列,则SQL_PRED_NONE。 (这与 ODBC 2 中的SQL_UNSEARCHABLE值相同。x.)

如果列可以在 WHERE 子句中使用,但只能与 LIKE 谓词一起使用,则SQL_PRED_CHAR。 (这与 ODBC 2 中的SQL_LIKE_ONLY值相同。x.)

SQL_PRED_BASIC如果列可用于 WHERE 子句以及除 LIKE 之外的所有比较运算符(比较、量化比较、BETWEENDISTINCTINMATCHUNIQUE)。 (这与 ODBC 2 中的SQL_ALL_EXCEPT_LIKE值相同。x.)

如果列可用于具有任何比较运算符的 WHERE 子句中,则SQL_SEARCHABLE。
UNSIGNED_ATTRIBUTE (ODBC 2.0) 10 Smallint 数据类型是否为无符号:

如果数据类型未签名,则SQL_TRUE。

如果数据类型已签名,SQL_FALSE。

如果特性不适用于数据类型或数据类型不是数值,则返回 NULL。
FIXED_PREC_SCALE (ODBC 2.0) 11 Smallint(非 NULL) 数据类型是否具有预定义的固定精度和小数位数(特定于数据源),例如货币数据类型:

如果已预定义固定精度和小数位数,则SQL_TRUE。

如果它没有预定义的固定精度和小数位数,则SQL_FALSE。
AUTO_UNIQUE_VALUE (ODBC 2.0) 12 Smallint 数据类型是否自动增加:

如果数据类型是自动增加,则SQL_TRUE。

如果数据类型不是自动增加,则SQL_FALSE。

如果特性不适用于数据类型或数据类型不是数值,则返回 NULL。

应用程序可以将值插入具有此属性的列中,但通常无法更新列中的值。

在自动递增列中插入时,插入时会将唯一值插入到列中。 增量未定义,但特定于数据源。 应用程序不应假定自动递增列从任何特定点开始或按任何特定值递增。
LOCAL_TYPE_NAME (ODBC 2.0) 13 Varchar 与数据源相关的数据类型名称的本地化版本。 如果是数据源不支持的本地化名称,则返回 NULL。 此名称仅用于显示,例如在对话框中。
MINIMUM_SCALE (ODBC 2.0) 14 Smallint 数据源中数据类型的最小小数位数。 如果数据类型的小数位数是固定的,则 MINIMUM_SCALE 和 MAXIMUM_SCALE 列将同时包含此值。 例如,SQL_TYPE_TIMESTAMP列可能具有小数秒的固定刻度。 当小数位数不适用时,将返回 NULL。 有关详细信息,请参阅 附录 D:数据类型中的列大小、小数位数、传输八进制数长度和显示大小
MAXIMUM_SCALE (ODBC 2.0) 15 Smallint 数据源上数据类型的最大缩放比例。 当小数位数不适用时,将返回 NULL。 如果未在数据源上单独定义最大刻度,而是定义为与最大精度相同,则此列包含与COLUMN_SIZE列相同的值。 有关详细信息,请参阅 附录 D:数据类型中的列大小、小数位数、传输八进制数长度和显示大小
SQL_DATA_TYPE (ODBC 3.0) 16 Smallint NOT NULL 在描述符的SQL_DESC_TYPE字段中显示 SQL 数据类型的值。 此列与DATA_TYPE列相同,间隔和日期/时间数据类型除外。

对于间隔和日期/时间数据类型,结果集中的SQL_DATA_TYPE字段将返回SQL_INTERVAL或SQL_DATETIME,SQL_DATETIME_SUB字段将返回特定间隔或日期/时间数据类型的子代码。 (请参阅 附录 D:数据类型。)
SQL_DATETIME_SUB (ODBC 3.0) 17 Smallint 当SQL_DATA_TYPE的值SQL_DATETIME或SQL_INTERVAL时,此列包含 datetime/interval 子代码。 对于日期/时间和间隔以外的数据类型,此字段为 NULL。

对于间隔或日期/时间数据类型,结果集中的SQL_DATA_TYPE字段将返回SQL_INTERVAL或SQL_DATETIME,SQL_DATETIME_SUB字段将返回特定间隔或日期/时间数据类型的子代码。 (请参阅 附录 D:数据类型。)
NUM_PREC_RADIX (ODBC 3.0) 18 Integer 如果数据类型是近似数值类型,则此列包含值 2 以指示COLUMN_SIZE指定一个位数。 对于确切的数字类型,此列包含值 10 以指示COLUMN_SIZE指定一些十进制数字。 否则,此列为 NULL。
INTERVAL_PRECISION (ODBC 3.0) 19 Smallint 如果数据类型是间隔数据类型,则此列包含间隔前导精度的值。 (请参阅 附录 D:数据类型中的间隔数据类型精度 。)否则,此列为 NULL。

属性信息可以应用于数据类型或结果集中的特定列。 SQLGetTypeInfo 返回与数据类型关联的属性的相关信息; SQLColAttribute 返回与结果集中的列关联的属性的相关信息。

有关以下内容的信息 请参阅
将缓冲区绑定到结果集中的列 SQLBindCol 函数
取消语句处理 SQLCancel 函数
返回有关结果集中的列的信息 SQLColAttribute 函数
提取数据块或滚动结果集 SQLFetchScroll 函数
提取单行或仅向前方向的数据块 SQLFetch 函数
返回有关驱动程序或数据源的信息 SQLGetInfo 函数

另请参阅

ODBC API 参考
ODBC 头文件