SQLBindParameter 要么说它需要更多数据,要么忽略我的值
SQLBindParameter either says it needs more data or ignores my value
我有以下方法将 int
值绑定到 SQL 语句:
void BindIntColumn(int nColumn, int nValue)
{
ASSERT(m_hStmt != SQL_NULL_HSTMT);
SQLINTEGER nSize = sizeof(nValue);
SQLRETURN nReturn = ::SQLBindParameter(m_hStmt, nColumn, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &nValue, 0, &nSize);
COdbcException::CheckError(nReturn, m_hStmt, SQL_HANDLE_STMT);
}
当我运行这段代码时,::SQLBindParameter()
returnsSQL_NEED_DATA
。不知道为什么。
如果我将 ::SQLBindParameter()
的最后一个参数更改为 nullptr
,则它 returns SQL_SUCCESS
。 SQLExecute()
实际上确实添加了该行!但是为该列添加的值是一些随机大数,例如 13498810。(传递给此方法的值为 1。)
我也尝试将 nValue
参数更改为类型 long
但得到了相同的结果。
谁能帮我解释一下?我只想将一个整数值绑定到我的语句。
SQLBindParameter 的 ParameterValuePtr 参数是一个延迟参数,即该值在您调用 SQLExecute 或 SQLExecDirect 之前被存储并且不会被使用,并且它需要在那个时候有效。 StrLen_or_IndPtr 参数也一样(只要它不为空)。这里你传递了一个局部变量的地址,但它在语句执行前超出了范围。
您关于 SQL_NEED_DATA 的错误没有任何意义,因为它根本没有被记录为 SQLBindParameter 的合法 return 值。
我有以下方法将 int
值绑定到 SQL 语句:
void BindIntColumn(int nColumn, int nValue)
{
ASSERT(m_hStmt != SQL_NULL_HSTMT);
SQLINTEGER nSize = sizeof(nValue);
SQLRETURN nReturn = ::SQLBindParameter(m_hStmt, nColumn, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, &nValue, 0, &nSize);
COdbcException::CheckError(nReturn, m_hStmt, SQL_HANDLE_STMT);
}
当我运行这段代码时,::SQLBindParameter()
returnsSQL_NEED_DATA
。不知道为什么。
如果我将 ::SQLBindParameter()
的最后一个参数更改为 nullptr
,则它 returns SQL_SUCCESS
。 SQLExecute()
实际上确实添加了该行!但是为该列添加的值是一些随机大数,例如 13498810。(传递给此方法的值为 1。)
我也尝试将 nValue
参数更改为类型 long
但得到了相同的结果。
谁能帮我解释一下?我只想将一个整数值绑定到我的语句。
SQLBindParameter 的 ParameterValuePtr 参数是一个延迟参数,即该值在您调用 SQLExecute 或 SQLExecDirect 之前被存储并且不会被使用,并且它需要在那个时候有效。 StrLen_or_IndPtr 参数也一样(只要它不为空)。这里你传递了一个局部变量的地址,但它在语句执行前超出了范围。
您关于 SQL_NEED_DATA 的错误没有任何意义,因为它根本没有被记录为 SQLBindParameter 的合法 return 值。