私はODBCのSQLGetDataを使って文字列データを検索しています。デフォルトでは256バイトのバッファを使用しています。バッファーが短すぎる場合、私は文字列のために十分な大きさの新しいバッファーを割り当てて、SQLGetData()をもう一度呼び出しています。ODBCで長い文字列を処理する方法は?
これは2度目の呼び出しでは、フィールド全体ではなく最後の呼び出し後に残されたものだけを返すようです。
SQLGetDataが2番目のバッファにフィールド全体を返すようにこの動作をリセットする方法はありますか?
char buffer[256];
SQLLEN sizeNeeded = 0;
SQLRETURN ret = SQLGetData(_statement, _columnIndex, SQL_C_CHAR, (SQLCHAR*)buffer, sizeof(buffer), &sizeNeeded);
if(ret == SQL_SUCCESS)
{
return std::string(buffer);
}
else if(ret == SQL_SUCCESS_WITH_INFO)
{
std::auto_ptr<char> largeBuffer(new char[sizeNeeded + 1]);
// Doesn't return the whole field, only what was left...
SQLGetData(_statement, _columnIndex, SQL_C_CHAR, (SQLCHAR*)largeBuffer.get(), sizeNeeded, &sizeNeeded);
}
ありがとうございました!
受信したデータを新しいバッファにコピーして新しいデータを追加するだけではどうですか? –
バッファが切り捨てられただけでなく、SQL_SUCCESS_WITH_INFOが返される理由はたくさんあることに注意してください。特定の条件に対してSQLSTATEが01004かどうかを調べるには、SQLGetDiagRecを呼び出す必要があります。 – Joe
本当にありがとうございます。 – James