SQLBindParameter用于输出varchar

SQLBindParameter for output varchar

本文关键字:varchar 输出 用于 SQLBindParameter      更新时间:2023-10-16

我有一个具有varchar输出参数的存储过程:

@UserIDOut varchar(50) OUTPUT

在我的c++代码中,我尝试将输出参数绑定到this:

...
SQLCHAR userIDOut[50];
int dbReturn = ExecProc(...(SQLCHAR**)&userIDOut);
...
int ExecProc(...SQLCHAR **userIDOut)
{
...
    SQLINTEGER cbParam7 = SQL_NTS;
    retcode = SQLBindParameter(hstmt1, 7, SQL_PARAM_OUTPUT, SQL_C_CHAR, SQL_VARCHAR, 50, 0, *userIDOut, 50, &cbParam7);
    retcode = SQLExecDirect(hstmt1, (UCHAR*)"{? = call UpdateUser(?,?,?,?,?,?)}", SQL_NTS);

我还有其他几个输入参数,以及这个存储过程的一个返回值。我已经尝试了这个函数调用的一些变化,但我从来没有得到任何在userIDOut。如果我从SQL Server执行存储过程,我将得到正确的输出。

任何想法吗?

根据注释:

需要将指向userIDOut的指针传递给SQLBindParameter。你传递的不是一个指向userIDOut的指针,而是userIDOut的第一个字节被重新解释为一个指针。

数组隐式地转换为指向其第一个元素的指针(并且由于数组连续存储在内存中,这使得其他数据也可以访问),因此不需要写&userIDOut,如果将类型更改为SQLCHAR *,则只需写userIDOut

int ExecProc(..., SQLCHAR *userIDOut)
{
  ...
  ... SQLBindParameter(..., userIDOut, 50, &cbParam7);
  ...
}
// To call
... ExecProc(..., userIDOut);

如果您愿意,您可以继续使用指向userIDOut的指针,但这要求您使用指向数组的指针,而不是指向指针的指针,并且指向数组的指针使用一种尴尬的语法,并且通常没有比指向数组元素的指针更多的值:

int ExecProc(..., SQLCHAR (*userIDOut)[50])
{
  ...
  ... SQLBindParameter(..., userIDOut, 50, &cbParam7);
  ...
}
// To call
... ExecProc(..., &userIDOut);