一致性
推出版本:ODBC 1.0 标准合规性:开放组
总结
SQLSpecialColumns 检索指定表中列的以下信息:
唯一标识表中行的最优列集。
当行中任一值被交易更新时,列会自动更新。
Syntax
SQLRETURN SQLSpecialColumns(
SQLHSTMT StatementHandle,
SQLSMALLINT IdentifierType,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * TableName,
SQLSMALLINT NameLength3,
SQLSMALLINT Scope,
SQLSMALLINT Nullable);
Arguments
StatementHandle
[输入]语句句柄。
标识类型
[输入]要返回的列类型。 必须是以下值之一:
SQL_BEST_ROWID:返回通过从列或列中获取值,使指定表中任意行能够唯一识别的最优列或列集合。 列可以是专门为此目的设计的伪列(如Oracle ROWID或Ingres TID),也可以是表中任意唯一索引的列或列。
SQL_ROWVER:返回指定表中当行中任意值被任何事务更新时(如SQLBase ROWID或Sybase TIMESTAMP)数据源自动更新的列或列。
CatalogName
[输入]表格名称。 如果驱动程序支持某些表的目录,但不支持其他表,例如当驱动程序从不同的数据库管理系统检索数据时,空字符串(“”)表示那些没有目录的表。
目录名称 不能包含字符串搜索模式。
如果SQL_ATTR_METADATA_ID语句属性设置为SQL_TRUE,目录 名 被视为标识符,其大小写不重要。 如果是SQL_FALSE,目录 名称 是一个普通的论证;它被字面处理,且其案例意义重大。 有关详细信息,请参阅目录函数中的参数。
NameLength1
[输入]*目录名称字符长度。
架构名称
[输入]表的模式名称。 如果驱动程序支持某些表的模式,而不支持其他表,例如当驱动程序从不同数据库管理系统(DBMS)检索数据时,空字符串(“”)表示那些没有模式的表。
SchemaName 不能包含字符串搜索模式。
如果SQL_ATTR_METADATA_ID语句属性设置为 SQL_TRUE,SchemaName 被视为标识符,其大小写不重要。 如果是 SQL_FALSE,SchemaName 是一个普通参数;它被字面处理,且其案例意义重大。
NameLength2
[输入]*SchemaName字符长度。
TableName
[输入]表名。 该论证不可能是空指针。
TableName 不能包含字符串搜索模式。
如果SQL_ATTR_METADATA_ID语句属性设置为 SQL_TRUE,TableName 被视为标识符,其大小写不重要。 如果是SQL_FALSE,则 TableName 是一个普通参数;它被字面处理,且其案例意义重大。
NameLength3
[输入]*TableName字符长度。
Scope
[输入]最低要求的罗维德范围。 归还的rowid可能更为广泛。 必须是以下选项之一:
SQL_SCOPE_CURROW:rowid 只有在该行位置上才保证有效。 如果行被其他事务更新或删除,后续使用 rowid 重新选择时,可能无法返回该行。
SQL_SCOPE_TRANSACTION:rowid 在当前交易期间保证有效。
SQL_SCOPE_SESSION:rowid 在会话期间(跨交易边界)均保证有效。
可以为 Null
[输入]决定是否返回可能为NULL值的特殊列。 必须是以下选项之一:
SQL_NO_NULLS:排除可能为NULL值的特殊列。 有些驱动程序无法支持SQL_NO_NULLS,如果SQL_NO_NULLS指定,这些驱动程序会返回空的结果集。 申请应为此案做好准备,只有在绝对必要时才申请SQL_NO_NULLS。
SQL_NULLABLE:即使列可能为NULL值,也返回特殊列。
Returns
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。
诊断
当 SQLSpecialColumns 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用 SQLGetDiagRec 获得关联的 SQLSTATE 值,Handle 为 SQL_HANDLE_STMT,Handle 为 StatementHandle。 下表列出了 SQLSpecialColumns 通常返回的SQLSTATE值,并在该函数的上下文中解释了每个值;“(DM)” 符号位于驱动程序管理器返回的 SQLSTATE 描述之前。 除非另有说明,否则与每个 SQLSTATE 值关联的返回代码SQL_ERROR。
| SQLSTATE | Error | Description |
|---|---|---|
| 01000 | 常规警告 | 特定于驱动程序的信息性消息。 (函数返回SQL_SUCCESS_WITH_INFO。) |
| 08S01 | 通信链接失败 | 驱动程序与驱动程序连接到的数据源之间的通信链接在函数完成处理之前失败。 |
| 24000 | 游标状态无效 |
StatementHandle 上打开了一个光标,调用了 SQLFetch 或 SQLFetchScroll。 如果 SQLFetch 或 SQLFetchScroll 未返回SQL_NO_DATA,驱动会返回该错误;如果 SQLFetch 或 SQLFetchScroll 返回SQL_NO_DATA,驱动也会返回该错误。 StatementHandle 上开着光标,但未调用 SQLFetch 或 SQLFetchScroll。 |
| 40001 | 序列化失败 | 由于资源死锁与另一个事务,事务已回滚。 |
| 40003 | 语句完成未知 | 执行此函数期间关联的连接失败,无法确定事务的状态。 |
| HY000 | 常规错误 | 发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述错误及其原因。 |
| HY001 | 内存分配错误 | 驱动程序无法分配支持执行或完成函数所需的内存。 |
| HY008 | 操作已取消 | 为 StatementHandle 启用了异步处理。 调用了该函数,在完成执行之前,对 StatementHandle 调用了 SQLCancel 或 SQLCancelHandle。 然后,在 StatementHandle 上再次调用该函数。 调用了函数,在完成执行之前,SQLCancel 或 SQLCancelHandle 从多线程应用程序中的不同线程调用 StatementHandle。 |
| HY009 | 无效使用 null 指针 |
TableName 参数是空指针。 SQL_ATTR_METADATA_ID语句属性被设置为 SQL_TRUE,CatalogName 参数是空指针,SQL_CATALOG_NAME InfoType 返回支持目录名称。 (DM) SQL_ATTR_METADATA_ID语句属性设置为 SQL_TRUE,SchemaName 参数是空指针。 |
| HY010 | 函数序列错误 | (DM) 为与 StatementHandle 关联的连接句柄调用异步执行函数。 当调用 SQLSpecialColumns 时,该函数仍在执行中。 (DM) 为 StatementHandle 调用了 SQLExecute、SQLExecDirect 或 SQLMoreResults,并返回了SQL_PARAM_DATA_AVAILABLE。 在检索所有流式处理参数的数据之前调用此函数。 (DM) 为 StatementHandle 调用异步执行函数(而不是此函数),并在调用此函数时仍在执行。 (DM) 为 StatementHandle 调用了 SQLExecute、SQLExecDirect、SQLBulkOperations 或 SQLSetPos,并返回了SQL_NEED_DATA。 在为所有数据执行参数或列发送数据之前调用此函数。 |
| HY013 | 内存管理错误 | 无法处理函数调用,因为基础内存对象无法访问,可能是因为内存条件低。 |
| HY090 | 字符串或缓冲区长度无效 | (DM) 其中一个长度参数的值小于0但不等于SQL_NTS。 其中一个长度参数的值超过了对应名称的最大长度值。 每个名称的最大长度可以通过调用 SQLGetInfo 的 InfoType 值获得:SQL_MAX_CATALOG_NAME_LEN、SQL_MAX_SCHEMA_NAME_LEN 或 SQL_MAX_TABLE_NAME_LEN。 |
| HY097 | 列型超出范围 | (DM) 指定了一个无效的 IdentifierType 值。 |
| HY098 | 望远镜类型超出范围 | (DM) 指定了一个无效 的范围 值。 |
| HY099 | 可消除类型超出范围 | (DM) 指定了一个无效 的Nullable 值。 |
| 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 才能执行后期处理并完成操作。 |
Comments
当SQL_BEST_ROWID IdentifierType 参数时, SQLSpecialColumns 返回唯一标识表中每一行的列或列。 这些列总可用于 select-list 或 WHERE 子句。 SQLColumns 用于返回表列的各种信息,但它不一定返回唯一标识每行的列,或在事务更新行中任意值时自动更新的列。 例如, SQLColumns 可能不会返回 Oracle 伪列 ROWID。 这就是为什么使用 SQLSpecialColumns 来返回这些列。 有关详细信息,请参阅数据目录的用法。
注释
有关 ODBC 目录函数的常规用途、参数和返回数据的详细信息,请参阅 目录函数。
如果没有唯一标识每行的列, SQLSpecialColumns 返回一个没有行的行集;随后调用 SQLFetch 或 SQLFetchScroll 对该语句返回SQL_NO_DATA。
如果 IdentifierType、 Scope 或 Nullable 参数指定了数据源不支持的特征, SQLSpecialColumns 返回的是空的结果集。
如果SQL_ATTR_METADATA_ID语句属性设置为SQL_TRUE,目录 名、 模式名和 表名 参数被视为标识符,因此在某些情况下不能被设置为空指针。 (更多信息请参见 目录函数中的参数。)
SQLSpecialColumns 返回结果为标准结果集,按 SCOPE 排序。
已为 ODBC 3.x 重命名以下列。 列名的更改不会影响向后兼容,因为应用程序按列号绑定。
| ODBC 2.0 列 | ODBC 3.x 列 |
|---|---|
| PRECISION | 列大小 |
| 长度 | BUFFER_LENGTH |
| 规模 | 小数位数 |
为了确定COLUMN_NAME列的实际长度,应用程序可以调用 SQLGetInfo ,并选择 SQL_MAX_COLUMN_NAME_LEN 选项。
下表列出了结果集中的列。 驱动可以定义第8列(PSEUDO_COLUMN)之外的其他列。 应用程序应通过从结果集末尾倒计时来访问驱动程序特定的列,而不是指定明确的序数位置。 有关详细信息,请参阅 目录函数返回的数据。
| 列名称 | 列号 | 数据类型 | Comments |
|---|---|---|---|
| 范围(ODBC 1.0) | 1 | Smallint | 真正的“流氓”范围。 包含以下数值之一: SQL_SCOPE_CURROW SQL_SCOPE_TRANSACTION SQL_SCOPE_SESSION 当 IdentifierType 被 SQL_ROWVER 时返回 NULL。 关于每个值的描述,请参见本节前半部分“语法”中的 范围 描述。 |
| COLUMN_NAME(ODBC 1.0) | 2 | Varchar 非 NULL | 列名称。 驱动程序返回一个没有名称的列的空字符串。 |
| DATA_TYPE(ODBC 1.0) | 3 | Smallint(非 NULL) | SQL 数据类型。 这可以是 ODBC SQL 数据类型或特定于驱动程序的 SQL 数据类型。 有关有效 ODBC SQL 数据类型列表,请参见 SQL 数据类型。 有关特定于驱动程序的 SQL 数据类型的信息,请参阅驱动程序的文档。 |
| TYPE_NAME(ODBC 1.0) | 4 | Varchar 非 NULL | 数据源依赖数据类型名称;例如,“CHAR”、“VARCHAR”、“MONEY”、“LONG VARBINARY”或“CHAR() FOR BIT DATA”。 |
| COLUMN_SIZE(ODBC 1.0) | 5 | 整数 | 数据源列的大小。 有关列大小的更多信息,请参见 列大小、十进制数字、传输八重奏长度和显示大小。 |
| BUFFER_LENGTH(ODBC 1.0) | 6 | 整数 | 如果指定了SQL_C_DEFAULT,则 SQLGetData 或 SQLFetch 操作上传输的数据的长度(以字节为单位)。 对于数值数据,此大小可能与存储在数据源上的数据的大小不同。 该值可能与字符数据的COLUMN_SIZE列不同。 更多信息请参见 列大小、十进制数字、传输八重奏长度和显示大小。 |
| DECIMAL_DIGITS(ODBC 1.0) | 7 | Smallint | 数据源列的小数点。 对于不适用小数位的数据类型,NULL 会返回。 有关十进制数字的更多信息,请参见 列大小、十进制数字、传输八重奏长度和显示大小。 |
| PSEUDO_COLUMN(ODBC 2.0) | 8 | Smallint | 表示该列是否为伪列,如Oracle ROWID: SQL_PC_UNKNOWN SQL_PC_NOT_PSEUDO SQL_PC_PSEUDO 注: 为了最大化互操作性,伪列不应引用 SQLGetInfo返回的标识符引号字符。 |
在应用程序检索到SQL_BEST_ROWID值后,应用程序可以利用这些值在定义范围内重新选择该行。 SELECT 语句保证返回无行或返回一行。
如果应用程序根据行列重新选择行但找不到该行,应用可以假设该行已被删除或列列被修改。 反之则不成立:即使行位没有变化,行中的其他列也可能发生变化。
列类型SQL_BEST_ROWID返回的列对于需要在结果集内前后滚动以从一组行中获取最新数据的应用程序非常有用。 行的列在该行上时保证不会变化。
即使光标未位于行上,行的列或列仍可能有效;应用程序可以通过检查结果集中的 SCOPE 列来确定。
对于需要检查某行在重新选择行时,是否更新了某行的列,SQL_ROWVER返回的列非常有用。 例如,在用 rowid 重新选择行后,应用程序可以比较SQL_ROWVER列中的前一数值与刚刚获取的数值。 如果SQL_ROWVER列中的值与前一列不同,应用程序可以提醒用户显示屏上的数据发生了变化。
代码示例
类似函数的代码示例请参见 SQLColumns。
相关函数
| 有关以下内容的信息 | 请参阅 |
|---|---|
| 将缓冲区绑定到结果集中的列 | SQLBindCol 函数 |
| 取消语句处理 | SQLCancel 函数 |
| 返回表格中的列 | SQLColumns 函数 |
| 仅向前取一行或数据块 | SQLFetch 函数 |
| 提取数据块或滚动结果集 | SQLFetchScroll 函数 |
| 返回主键的列 | SQLPrimaryKeys 函数 |