规范: | DB2 CLI 2.1 | ODBC 2.0 |
对于所有 C 数据类型,SQLBindParameter() 用来使 SQL 语句中的参数标记与应用程序变量相关联(绑定)。在这种情况下,调用 SQLExecute() 或 SQLExecDirect() 时,数据是从应用程序传送至 DBMS 的。传送数据时,可能会发生数据转换。
语法
SQLRETURN SQL_API SQLBindParameter( SQLHSTMT StatementHandle, /* hstmt */ SQLUSMALLINT ParameterNumber, /* ipar */ SQLSMALLINT InputOutputType, /* fParamType */ SQLSMALLINT ValueType, /* fCType */ SQLSMALLINT ParameterType, /* fSqlType */ SQLUINTEGER ColumnSize, /* cbColDef */ SQLSMALLINT DecimalDigits, /* ibScale */ SQLPOINTER ParameterValuePtr,/* rgbValue */ SQLINTEGER BufferLength, /* cbValueMax */ SQLINTEGER *FAR StrLen_or_IndPtr);/* pcbValue */
函数自变量
数据类型 | 自变量 | 使用 | 描述 |
---|---|---|---|
SQLHSTMT | StatementHandle | 输入 | 语句句柄。 |
SQLUSMALLINT | ParameterNumber | 输入 | 参数标记号码从左到右,从 1 开始依次编号。 |
SQLSMALLINT | InputOutputType | 输入 | 参数类型。支持的类型是:
|
SQLSMALLINT | ValueType | 输入 | 参数的 C 数据类型。下列类型受支持:
指定 SQL_C_DEFAULT 会导致将数据从其缺省 C 数据类型转换为 ParameterType 中指示的类型。 |
SQLSMALLINT | ParameterType | 输入 | 参数的 SQL 数据类型。支持的类型是:
|
SQLUINTEGER | ColumnSize | 输入 | 对应的参数标记的精度。
|
SQLSMALLINT | DecimalDigits | 输入 | (相应参数的小数位数)如果 ParameterType 是 SQL_DECIMAL。 |
SQLPOINTER | ParameterValuePtr | 输入(延迟)和/或输出(延迟) |
|
SQLINTEGER | BufferLength | 输入 | 对于字符和二进制数据,BufferLength 指定 ParameterValuePtr 缓冲区的长度。对于非字符和非二进制数据,此自变量被忽略,且 ParameterValuePtr 缓冲区的长度被假定为与 C 数据类型相关联的长度。对于输出参数,BufferLength 被用来确定是否截断数据。 |
SQLINTEGER * | StrLen_or_IndPtr | 输入(延迟)和/或输出(延迟) |
|
用法
在 SQL 语句中,参数标记由 ? 字符表示,用来指示语句中的一个位置,在该处,应用程序提供的值将在执行该语句时被替换。此值可以从应用程序变量获取。SQLBindParameter() 用来将应用程序存储区与参数标记绑定。
在执行 SQL 语句之前,应用程序必须将一个变量与 SQL 语句中的每个参数标记绑定。对于此函数,ParameterValuePtr 和 StrLen_or_IndPtr 是延迟自变量。执行该语句时,存储位置必须有效且包含输入数据值。这表示 SQLExecDirect() 或 SQLExecute() 调用都必须保存在与 SQLBindParameter() 调用相同的过程作用域中,或者这些存储位置必须是动态分配的,或是以静态方式或全局方式声明的。
参数标记按编号(ColumnNumber)引用,并且是从 1 开始从左到右按顺序编号的。
在调用下列其中一个函数之前,此函数绑定的所有参数仍然有效:
在执行 SQL 语句并处理结果之后,应用程序可能想重新使用该语句句柄来执行另一 SQL 语句。如果参数标记规范不同(参数数目、长度或类型不同),则必须使用 SQL_RESET_PARAMS 调用 SQLFreeStmt(),以复位或清除参数绑定。
ValueType 给出的 C 缓冲区数据类型必须与 ParameterType 指示的 SQL 数据类型相兼容,否则会出错。
因为在执行语句之前,不会验证 ParameterValuePtr 和 StrLen_or_IndPtr 所引用的变量中的数据,所以在调用 SQLExecute() 或 SQLExecDirect() 之前,不会检测或报告数据内容错误或格式错误。
对于此函数,ParameterValuePtr 和 StrLen_or_IndPtr 是延迟自变量。在 InputOutputType 设置为 SQL_PARAM_INPUT 的情况下,当执行语句时,存储位置必须有效且包含输入数据值。这表示 SQLExecDirect() 或 SQLExecute() 调用都必须保存在与 SQLBindParameter() 调用相同的过程作用域中,或者这些存储位置必须是动态分配的,或是以静态方式或全局方式声明的。
DB2 Everyplace 支持 SQL_PARAM_INPUT、SQL_PARAM_INPUT_OUTPUT 和 SQL_PARAM_OUTPUT。DB2 Everyplace 不支持 SQLPutData(),所以不应将参数值存储在 ParameterValuePtr 缓冲区中。
对于字符和二进制 C 数据,BufferLength 自变量指定 ParameterValuePtr 缓冲区的长度。对于所有其它类型的 C 数据,BufferLength 自变量被忽略。
返回码
诊断
表 35. SQLBindParameter SQLSTATE
SQLSTATE | 描述 | 解释 |
---|---|---|
07006 | 转换无效。 | 从 ValueType 自变量标识的数据值到 ParameterType 自变量标识的数据类型的转换不是有意义的转换。(例如,从 SQL_C_DATE 转换至 SQL_DOUBLE。) |
40003 08S01 | 通信链路故障。 | 函数尚未完成,应用程序与数据源间的通信链路就失效了。 |
58004 | 意外系统故障。 | 不可恢复的系统错误。 |
HY001 | 内存分配失败。 | DB2 CLI 无法分配支持函数的执行或完成所需的内存。 |
HY003 | 程序类型超出范围。 | ParameterNumber 自变量指定的值不是有效的数据类型或 SQL_C_DEFAULT。 |
HY004 | SQL 数据类型超出范围。 | 对 ParameterType 自变量指定的值不是有效的 SQL 数据类型。 |
HY009 | 自变量值无效。 | ParameterValuePtr 自变量是空指针,且 StrLen_or_IndPtr 自变量是空指针,而 InputOutputType 不是 SQL_PARAM_OUTPUT。 |
HY013 | 发生意外的内存处理错误。 | DB2 CLI 无法访问支持函数的执行或完成所需的内存。 |
HY090 | 字符串或缓冲区长度无效。 | 对 BufferLength 自变量指定的值小于 0。 |
HY093 | 参数号无效。 | 对 ValueType 自变量指定的值小于 1 或大于服务器支持的最大参数数目。 |
HY094 | 小数位值无效。 | 对 ParameterType 指定的值是 SQL_DECIMAL 或 SQL_NUMERIC,对 DecimalDigits 指定的值小于 0 或大于 ParamDef 自变量(精度)的值。 |
HY104 | 精度值无效。 | 对 ParameterType 指定的值是 SQL_DECIMAL 或 SQL_NUMERIC,对 ParamDef 指定的值小于 1。 |
HY105 | 参数类型无效。 | InputOutputType 不是 SQL_PARAM_INPUT。 |
HYC00 | 驱动程序不起作用。 | DB2 CLI 或数据源不支持由对 ValueType
自变量指定的值和对 ParameterType 祖变量指定的值的组合所指定的转换。
对 ParameterType 自变量指定的值不受 DB2 CLI 或数据源支持。 |
相关参考