SQLGetStmtAttr 函数

一致性
推出版本: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
[输出]指向缓冲区,返回属性指定属性 值的值

如果 ValuePtrNULL,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 调用了 SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos,并返回了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。 此外, BufferLengthStringLengthPtr 参数不被使用。 如果该值是空终止字符串,应用程序在 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 函数