c++ - 输出 varchar 的 SQLBindParameter

标签 c++ sql stored-procedures

我有一个存储过程,它有一个 varchar 输出参数:

@UserIDOut varchar(50) OUTPUT

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

...
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 的指针,但这需要您使用指向数组的指针,而不是指向指针的指针,并且指向数组的指针使用一种笨拙的语法,通常没有比指向数组元素之一的指针更多的值(value):

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

// To call
... ExecProc(..., &userIDOut);

关于c++ - 输出 varchar 的 SQLBindParameter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16444822/

相关文章:

c++ - 如何在编译时判断一个类型是否派生自模板类?

c++ - 使用四元数旋转相机

sql - NOT IN运算符问题Oracle

mysql - SQlite 多表引用

sql - 更高级别聚合的总和

c++ - 无法添加控制变量

c++ - 静态库的链接器错误

sql-server - 如何在 sp_executesql 中使用 OPENQUERY?

mysql - 错误 1329 : No data - zero rows fetched, 选择或处理 - 即使一切都正确完成

mysql - NOT IN 比 MySQL 中的不等式快吗?