SQLGetTypeInfo 函数

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

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

重要

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

语法

  
SQLRETURN SQLGetTypeInfo(  
     SQLHSTMT      StatementHandle,  
     SQLSMALLINT   DataType);  

参数

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

DataType
[输入]SQL 数据类型。 这必须是附录 D: 数据类型的 SQL 数据类型 部分中的值之一,或者是特定于驱动程序的 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时,可以通过调用 SQLGetDiagRec 并调用 HandleType 为 SQL_HANDLE_STMT 和 StatementHandle来获取关联的 SQLSTATE 值。 下表列出了 SQLGetTypeInfo 通常返回的 SQLSTATE 值,并说明了此函数上下文中的每个值;表示法“ (DM) ”位于驱动程序管理器返回的 SQLSTATEs 说明之前。 与每个 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。 如果 SQLFetchSQLFetchScroll 未返回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 上再次调用该函数。

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

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

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

(DM) SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos 已为 StatementHandle 调用并返回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 为 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 TABLEALTER TABLE 语句中使用此名称。
DATA_TYPE (ODBC 2.0) 2 Smallint(非 NULL) SQL 数据类型。 这可以是 ODBC SQL 数据类型或特定于驱动程序的 SQL 数据类型。 对于 datetime 或 interval 数据类型,此列返回简洁的数据类型 (,如 SQL_TYPE_TIME 或 SQL_INTERVAL_YEAR_TO_MONTH) 。 有关有效 ODBC SQL 数据类型的列表,请参阅附录 D:数据类型中的 SQL 数据类型。 有关特定于驱动程序的 SQL 数据类型的信息,请参阅驱动程序的文档。
COLUMN_SIZE (ODBC 2.0) 3 Integer 服务器支持此数据类型的最大列大小。 对于数值数据,这是最大精度。 对于字符串数据,这是以字符为单位的长度。 对于 datetime 数据类型,这是字符串表示形式的长度(以字符为单位), (假定秒小数部分) 允许的最大精度。 对于列大小不适用的数据类型,返回 NULL。 对于间隔数据类型,这是间隔前导精度定义的间隔文本 (字符表示形式的字符数;请参阅附录 D:数据类型) 中的 Interval 数据类型长度

有关列大小的详细信息,请参阅附录 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等于“长度”。如果数据类型定义没有参数,则返回 NULL;例如 INTEGER。

驱动程序以所用国家/地区的语言提供CREATE_PARAMS文本。
可为 NULL (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.)

SQL_SEARCHABLE列是否可以在 WHERE 子句中使用任何比较运算符。
UNSIGNED_ATTRIBUTE (ODBC 2.0) 10 Smallint 数据类型是否为无符号:

如果数据类型为无符号,则SQL_TRUE。

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

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

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列相同,但 interval 和 datetime 数据类型除外。

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

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

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

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

另请参阅

ODBC API 参考
ODBC 头文件