我有一个存储过程,其输出参数为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执行存储过程,我会得到正确的输出。
有什么想法吗?
答案 0 :(得分:1)
根据评论:
您需要将指针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);