一致性
推出版本:ODBC 3.0 标准合规:ISO 92
总结
SQLGetStmtAttr 返回当前语句属性的设置。
注释
关于驱动管理器在 ODBC 3 时将该功能映射到什么的更多信息。x 应用正在与ODBC 2配合运行。x驱动, 参见应用程序 向后兼容映射替换函数。
Syntax
SQLRETURN SQLGetStmtAttr(
SQLHSTMT StatementHandle,
SQLINTEGER Attribute,
SQLPOINTER ValuePtr,
SQLINTEGER BufferLength,
SQLINTEGER * StringLengthPtr);
Arguments
StatementHandle
[输入]语句句柄。
属性
[输入]属性要检索。
ValuePtr
[输出]指向缓冲区,返回属性指定属性 值的值。
如果 ValuePtr 是 NULL,StringLengthPtr 仍然会返回 ValuePtr 指向的缓冲区中可返回的总字节数(不含字符数据的空终止字符)。
BufferLength
[输入]如果 Attribute 是 ODBC 定义的属性,ValuePtr 指向字符串或二进制缓冲区,则此参数应为 *ValuePtr 的长度。 如果 Attribute 是 ODBC 定义的属性,*ValuePtr 是整数,则忽略 BufferLength 。 如果 *ValuePtr 返回的值是 Unicode 字符串(调用 SQLGetStmtAttrW 时), BufferLength 参数必须是偶数。
如果 属性 是驱动程序定义的属性,应用程序通过设置 BufferLength 参数向驱动程序管理器指示该属性的性质。 缓冲长度 可以有以下数值:
如果 *ValuePtr 是指向字符字符串的指针,那么 BufferLength 就是该字符串或 SQL_NTS 的长度。
如果 *ValuePtr 是指向二进制缓冲区的指针,那么应用程序将 SQL_LEN_BINARY_ATTR(长度)宏的结果置入 BufferLength。 这会使 缓冲长度为负值。
如果 *ValuePtr 指向非字符字符串或二进制字符串的值,那么 BufferLength 应具有 SQL_IS_POINTER 值。
如果 *ValuePtr 包含固定长度的数据类型,那么 BufferLength 可以是 SQL_IS_INTEGER 或 SQL_IS_UINTEGER,视情况而定。
StringLengthPtr
[输出]指向缓冲区的指针,用于返回* ValuePtr中可返回的总字节数(不含空终止字符)。 如果属性值是一个字符字符串,且可返回的字节数大于或等于 BufferLength,则 *ValuePtr 中的数据会被截断为缓冲 长度 减去空终止字符长度,并由驱动程序进行空终止。
Returns
SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_ERROR 或SQL_INVALID_HANDLE。
诊断
当 SQLGetStmtAttr 返回 SQL_ERROR 或 SQL_SUCCESS_WITH_INFO 时,可以通过调用 SQLGetDiagRec 获得关联的 SQLSTATE 值,Handle 为 SQL_HANDLE_STMT,Handle 为 StatementHandle 。 下表列出 了SQLGetStmtAttr 通常返回的SQLSTATE值,并在此函数的上下文中解释了每个值;“(DM)” 符号位于驱动程序管理器返回的 SQLSTATE 描述之前。 除非另有说明,否则与每个 SQLSTATE 值关联的返回代码SQL_ERROR。
| SQLSTATE | Error | Description |
|---|---|---|
| 01000 | 常规警告 | 特定于驱动程序的信息性消息。 (函数返回SQL_SUCCESS_WITH_INFO。) |
| 01004 | 字符串数据,右截断 | * ValuePtr 中返回的数据被截断为 BufferLength 减去一个空终止字符的长度。 未截断字符串值的长度返回为 *StringLengthPtr。 (函数返回SQL_SUCCESS_WITH_INFO。) |
| 24000 | 游标状态无效 | 参数 属性SQL_ATTR_ROW_NUMBER 且光标未打开,或者光标位于结果集开始前或结束之后。 |
| HY000 | 常规错误 | 发生错误:没有特定的 SQLSTATE,也没有定义特定于实现的 SQLSTATE。 SQLGetDiagRec 在参数 MessageText 中返回的错误消息描述了错误及其原因。 |
| HY001 | 内存分配错误 | 驱动程序无法分配支持执行或完成函数所需的内存。 |
| HY010 | 函数序列错误 | (DM) 为与 StatementHandle 关联的连接句柄调用异步执行函数。 当调用 SQLGetStmtAttr 函数时,该异步函数仍在执行中。 (DM) 为 StatementHandle 调用异步执行函数,并在调用此函数时仍在执行。 (DM) 为 StatementHandle 调用了 SQLExecute、SQLExecDirect、SQLBulkOperations 或 SQLSetPos,并返回了SQL_NEED_DATA。 在为所有数据执行参数或列发送数据之前调用此函数。 |
| HY013 | 内存管理错误 | 无法处理函数调用,因为基础内存对象无法访问,可能是因为内存条件低。 |
| HY090 | 字符串或缓冲区长度无效 | (DM) *ValuePtr 是一个字符字符串,BufferLength 小于零,但不等于 SQL_NTS。 |
| HY092 | 无效属性/选项标识符 | 参数属性指定的 值在驱动程序 支持的ODBC版本中不适用。 |
| HY109 | 光标位置无效 | 属性 参数参数 SQL_ATTR_ROW_NUMBER,该行已被删除或无法获取。 |
| HY117 | 连接因未知事务状态而挂起。 仅允许断开连接和只读函数。 | (DM) 有关挂起状态的详细信息,请参阅 SQLEndTran 函数。 |
| HYC00 | 未实现可选功能 | 参数属性指定的 值是驱动 支持的 ODBC 版本的有效 ODBC 语句属性,但驱动不支持。 |
| HYT01 | 超过连接超时时间 | 在数据源响应请求之前,连接超时期限已过期。 连接超时期限通过 SQLSetConnectAttr 设置,SQL_ATTR_CONNECTION_TIMEOUT。 |
| IM001 | 驱动程序不支持此函数 | (DM) 与 StatementHandle 对应的驱动程序不支持该函数。 |
Comments
关于语句属性的一般信息,请参见 语句属性。
调用 SQLGetStmtAttr 时,在 *ValuePtr 中返回属性中指定的语句属性值。 该值可以是 SQLULEN 值或空终止字符字符串。 如果值是 SQLULEN 值,一些驱动程序可能只写缓冲区的低 32 位或 16 位,而不更改高阶位。 因此,应用程序应使用SQLULEN缓冲区,并在调用该函数前将该值初始化为0。 此外, BufferLength 和 StringLengthPtr 参数不被使用。 如果该值是空终止字符串,应用程序在 BufferLength 参数中指定该字符串的最大长度,驱动程序返回该字符串在 *StringLengthPtr 缓冲区中的长度。
为了让调用 SQLGetStmtAttr 的应用程序能够与 ODBC 2 协同工作。x 驱动程序,调用 SQLGetStmtAttr 会映射到 SQLGetStmtOption。
以下语句属性为只读,因此可以被 SQLGetStmtattr 检索,但不能被 SQLSetStmtAttr 设置:
SQL_ATTR_IMP_PARAM_DESC
SQL_ATTR_IMP_ROW_DESC
SQL_ATTR_ROW_NUMBER
有关可设置和检索的属性列表,请参见 SQLSetStmtAttr。
相关函数
| 有关以下内容的信息 | 请参阅 |
|---|---|
| 返回连接属性的设置 | SQLGetConnectAttr 函数 |
| 设置连接属性 | SQLSetConnectAttr 函数 |
| 设置语句属性 | SQLSetStmtAttr 函数 |