我使用ODBC SQLGetData检索字符串数据,默认使用256字节缓冲区。如果缓冲区太短,我将为该字符串分配一个足够大的新缓冲区,然后再次调用SQLGetData()。

似乎第二次调用此方法只会返回上次调用后剩下的内容,而不是整个字段。

有什么办法可以“重置”此行为,以便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);
}


谢谢你的帮助!

最佳答案

呼叫者有责任将数据放在一起。分块返回数据的限制可能是由于数据库提供程序而不是您的代码造成的,因此您需要能够以任何一种方式处理这种情况。

另外,您的代码也存在逻辑缺陷-您可能必须多次调用SQLGetData;每次可以使用SQL_SUCCESS_WITH_INFO / 01004返回需要附加到循环中的其他数据块。

08-04 18:16