2

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

@UserIDOut varchar(50) OUTPUT

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

...
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 执行存储过程,我会得到正确的输出。

有什么想法吗?

4

1 回答 1

1

根据评论:

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

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

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);
于 2013-05-10T18:34:16.357 回答