c++ - 如何使用 ODBC 处理长字符串?

标签 c++ sql c odbc

我正在使用 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/

相关文章:

c++ - AWS 登录 InvalidParameterException 缺少必需的参数 SRP_A

iphone - 为 iOS 设备创建唯一标识符?

php - 这段代码中可能存在 SQL 注入(inject)吗?

c - realloc 无法重新分配先前 malloc 的指针

c - UDP C 套接字 : Multiple Sockets Sharing Single Port

c++ - 虚函数覆盖是否违反LSP?

c++ - 通常,解引用指针表达式结果是引用类型吗?

php - 在 MYSQL 中指定 SUBTIME 间隔是否会阻止查询不必要地遍历整个表?

sql - 选择从今天到本月最后 15 日的数据?

c++ - 适当的散列函数来散列随机二进制字符串