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

コメントによると:

userIDOutへのポインタを渡す必要がありますSQLBindParameter。あなたが渡しているのは へのポインタではなく、ポインタとして再解釈されたuserIDOutの最初のバイトです。userIDOut

配列は最初の要素へのポインターに暗黙的に変換されます (配列はメモリに連続して格納されるため、残りのデータにもアクセスできるようになります) &userIDOutuserIDOutへのタイプSQLCHAR *

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

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

必要に応じて、 へのポインターを使用して作業を続けることもできますが、それにuserIDOutは、ポインターへのポインターではなく、配列へのポインターを使用する必要があり、配列へのポインターは厄介な構文を使用し、通常はそれ以上ありません。配列の要素の 1 つへのポインターよりも値:

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

// To call
... ExecProc(..., &userIDOut);
于 2013-05-10T18:34:16.357 に答える