我使用ODBC SQLGetData檢索字符串數據,使用256字節的緩衝區爲默認值。如果緩衝區太短,我將爲該字符串分配一個足夠大的新緩衝區,並再次調用SQLGetData()。如何使用ODBC處理長字符串?
看起來第二次調用這個函數只返回最後一次調用後留下的內容,而不是整個字段。
有什麼辦法可以'重置'這種行爲,所以SQLGetData將整個字段返回到第二個緩衝區?
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);
}
感謝您的幫助!
爲什麼不只是已接收到的數據複製到新的緩衝區,然後追加新的數據? – 2012-02-28 13:21:44
注意,有許多原因,它可能返回SQL_SUCCESS_WITH_INFO,不只是緩衝區被截斷。您需要調用SQLGetDiagRec來查找SQLSTATE是否爲您的特定條件的01004。 – Joe 2012-02-28 13:22:09
的確,謝謝。 – James 2012-02-28 13:27:48