我正在使用 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);
}
感谢您的帮助!
最佳答案
将数据放在一起是调用者的责任;以 block 的形式返回数据的限制可能是由于数据库提供程序而不是您的代码,因此您需要能够以任何一种方式处理这种情况。
您的代码也有逻辑缺陷——您可能必须多次调用 SQLGetData;每次都可以使用 SQL_SUCCESS_WITH_INFO/01004 返回额外的数据 block ,需要附加到循环中。
关于c++ - 如何使用 ODBC 处理长字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9482636/