一致性
推出版本:ODBC 1.0 标准合规:ODBC
总结
SQLPrimaryKeys 返回构成表主键的列名。 驱动程序以结果集的形式返回信息。 该函数不支持在单次调用中返回多个表的主键。
Syntax
SQLRETURN SQLPrimaryKeys(
SQLHSTMT StatementHandle,
SQLCHAR * CatalogName,
SQLSMALLINT NameLength1,
SQLCHAR * SchemaName,
SQLSMALLINT NameLength2,
SQLCHAR * TableName,
SQLSMALLINT NameLength3);
Arguments
StatementHandle
[输入]语句句柄。
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字符长度。
Returns
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。
诊断
当 SQLPrimaryKeys 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用 SQLGetDiagRec 获得关联的 SQLSTATE 值,Handle(SQL_HANDLE_STMT)和 StatementHandle 的 Handle。 下表列出了 SQLPrimaryKeys 通常返回的SQLSTATE值,并在此函数的上下文中解释了每个值;“(DM)” 符号位于驱动程序管理器返回的 SQLSTATE 描述之前。 除非另有说明,否则与每个 SQLSTATE 值关联的返回代码SQL_ERROR。
| SQLSTATE | Error | Description |
|---|---|---|
| 01000 | 常规警告 | 特定于驱动程序的信息性消息。 (函数返回SQL_SUCCESS_WITH_INFO。) |
| 08S01 | 通信链接失败 | 驱动程序与驱动程序连接到的数据源之间的通信链接在函数完成处理之前失败。 |
| 24000 | 游标状态无效 | (DM) 在 StatementHandle 上打开游标,并调用了 SQLFetch 或 SQLFetchScroll。 StatementHandle 上开着光标,但未调用 SQLFetch 或 SQLFetchScroll。 |
| 40001 | 序列化失败 | 由于资源死锁与另一个事务,事务已回滚。 |
| 40003 | 语句完成未知 | 执行此函数期间关联的连接失败,无法确定事务的状态。 |
| HY000 | 常规错误 | 发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 *MessageText 缓冲区中 SQLGetDiagRec 返回的错误消息描述错误及其原因。 |
| HY001 | 内存分配错误 | 驱动程序无法分配支持执行或完成函数所需的内存。 |
| HY008 | 操作已取消 | 为 StatementHandle 启用了异步处理。 调用了该函数,在完成执行之前,对 StatementHandle 调用了 SQLCancel 或 SQLCancelHandle。 然后,在 StatementHandle 上再次调用该函数。 调用了函数,在完成执行之前,SQLCancel 或 SQLCancelHandle 从多线程应用程序中的不同线程调用 StatementHandle。 |
| HY009 | 无效使用 null 指针 | (DM) TableName 参数是一个空指针。 SQL_ATTR_METADATA_ID语句属性设置为 SQL_TRUE,CatalogName 参数为空指针, SQLGetInfo SQL_CATALOG_NAME信息类型返回支持目录名称。 (DM) SQL_ATTR_METADATA_ID语句属性设置为 SQL_TRUE,SchemaName 参数是空指针。 |
| HY010 | 函数序列错误 | (DM) 为与 StatementHandle 关联的连接句柄调用异步执行函数。 当调用 SQLPrimaryKeys 函数时,该异步函数仍在运行。 (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,且该名称参数不是空指针。 名称长度参数之一的值超过了相应名称的最大长度值。 |
| 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
SQLPrimaryKeys 以标准结果集的形式返回,按TABLE_CAT、TABLE_SCHEM、TABLE_NAME和KEY_SEQ排序。 有关如何使用此信息的信息,请参阅 目录数据的用法。
以下栏目已更名为ODBC 3。x。 列名的更改不会影响向后兼容,因为应用程序按列号绑定。
| ODBC 2.0 列 | ODBC 3。x 列 |
|---|---|
| TABLE_QUALIFIER (表格限定符) | TABLE_CAT |
| 表所有者 | TABLE_SCHEM |
要确定TABLE_CAT、TABLE_SCHEM、TABLE_NAME和COLUMN_NAME列的实际长度,可以调用 SQLGetInfo ,并提供SQL_MAX_CATALOG_NAME_LEN、SQL_MAX_SCHEMA_NAME_LEN、SQL_MAX_TABLE_NAME_LEN和SQL_MAX_COLUMN_NAME_LEN选项。
注释
有关 ODBC 目录函数的常规用途、参数和返回数据的详细信息,请参阅 目录函数。
下表列出了结果集中的列。 驱动员还可以定义第6列(PK_NAME)之外的其他列。 应用程序应通过从结果集末尾倒计时来访问驱动程序特定的列,而不是指定明确的序数位置。 有关详细信息,请参阅 目录函数返回的数据。
| 列名称 | 列号 | 数据类型 | Comments |
|---|---|---|---|
| TABLE_CAT(ODBC 1.0) | 1 | Varchar | 主键表目录名称;如果不适用于数据源,则使用NULL。 如果驱动程序支持某些表的目录,但不支持其他表,例如当驱动程序从不同数据库管理系统检索数据时,对于没有目录的表,驱动程序会返回一个空字符串(“”)。 |
| TABLE_SCHEM(ODBC 1.0) | 2 | Varchar | 主键表模式名称;如果不适用于数据源,则使用NULL。 如果驱动程序支持某些表的模式,而不支持其他表,例如当驱动程序从不同数据库管理系统检索数据时,对于没有模式的表,驱动程序会返回一个空字符串(“”)。 |
| TABLE_NAME(ODBC 1.0) | 3 | Varchar 非 NULL | 主键表名称。 |
| COLUMN_NAME(ODBC 1.0) | 4 | Varchar 非 NULL | 主键列名。 驱动程序返回一个没有名称的列的空字符串。 |
| KEY_SEQ(ODBC 1.0) | 5 | Smallint(非 NULL) | 列序号按键(从1开始)。 |
| PK_NAME(ODBC 2.0) | 6 | Varchar | 主键名。 如果不适用于数据源,则使用NULL。 |
代码示例
参见 SQLForeignKeys。
相关函数
| 有关以下内容的信息 | 请参阅 |
|---|---|
| 将缓冲区绑定到结果集中的列 | SQLBindCol 函数 |
| 取消语句处理 | SQLCancel 函数 |
| 提取数据块或滚动结果集 | SQLFetchScroll 函数 |
| 仅向前取一行或数据块 | SQLFetch 函数 |
| 返回外键的列 | SQLForeignKeys 函数 |
| 返回表格统计和索引 | SQLStatistics 函数 |