0

SQL データベースから文字列を抽出しようとしていますが、何らかの理由でパラメーターが間違っていて、その理由がわかりません。これが私のコードです:

SQLHENV environHandle;
SQLHDBC connectHandle;
SQLHSTMT statement;
SQLCHAR* connectString = "MY_CONNECTION_STRING";
string path;
int jobID;  
SQLINTEGER pathstrlen = SQL_NTS;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &environHandle);
SQLSetEnvAttr(environHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC, environHandle, &connectHandle);
SQLDriverConnect(connectHandle, NULL, connectString, SQL_NTS, NULL, 1024, NULL, SQL_DRIVER_NOPROMPT);
SQLAllocHandle(SQL_HANDLE_STMT, connectHandle, &statement);

//THIS IS THE BINDPARAMETER WITH THE ISSUE...
SQLBindParameter(statement, 1, SQL_PARAM_OUTPUT, SQL_C_CHAR, SQL_VARCHAR, 400, 0, (SQLPOINTER)path.c_str(), path.length(), &pathstrlen);

SQLBindParameter(statement, 2, SQL_PARAM_OUTPUT, SQL_INTEGER, SQL_INTEGER, 10, 0, &jobID, 0, &pathstrlen);

SQLExecDirect(statement, (SQLCHAR*)"{CALL SP(?,?)}", SQL_NTS);

正常に実行されますが、要求した文字列情報は取得されませんが、2 番目のパラメーター (整数を取得するため) は正常に機能します。ParameterType を複数の異なるものに変更しようとしましたが、エラーがスローされます (たとえば、SQL_LONGVARCHAR は非推奨です)。

SQLでは、取得しようとしているデータは次のとおりです。

@Path nvarchar(4000) OUT
set @Path = 'test'

これに光を当てることができる人に前もって感謝します。私は一日中髪を引っ張っています。

4

1 に答える 1

2

ODBC はUnicode パラメーター タイプをサポートしているため、SQL_C_WCHARandSQL_WVARCHARの代わりにSQL_C_CHARand をSQL_VARCHARそれぞれ使用します。

他にも2つの問題があります。

まず、ANSIstringをパラメーターとして渡します。Unicode を使用している場合は、wstring代わりにワイド文字列を使用する必要があります。

次に、有効なバッファを に渡していませんSQLBindParameterstring.c_str()によって返される値はconst char*、読み取り専用のバッファです。書き込み可能なバッファを必要とする関数に hat を渡すことは無効です。これを行うと、文字列が破損します。path.length()ただし、 WILL を呼び出すとゼロが返されるため、データが返されないため、ケースで破損が発生することSQLBindParameterはありません。

WCHAR配列バッファーを宣言し、SQLBindParameterそれを渡して、データを書き込むための有効なバッファーを与える必要があります。wstringC++ オブジェクトで必要な場合は、そのバッファを に転送できます。

だから、このようなもの:

WCHAR path[401];  // 401 - width of you column + 1 for the null terminator
SQLBindParameter(statement, 1, SQL_PARAM_OUTPUT, SQL_C_WCHAR, SQL_WVARCHAR, 400, 0,     (SQLPOINTER)path, sizeof(path), &pathstrlen);

編集

ODBC データ変換テーブルを見ると、アプリケーションで Unicode 文字列を処理したくない場合は、ODBC でそのデータを Unicode から ANSI に変換できるはずです。

char path[401];  // 401 - width of you column + 1 for the null terminator
SQLBindParameter(statement, 1, SQL_PARAM_OUTPUT, SQL_C_WCHAR, SQL_WVARCHAR, 400, 0,     (SQLPOINTER)path, sizeof(path), &pathstrlen);
于 2013-02-06T18:23:53.833 に答える