c++ - 从 C++ mysql 连接器选择将 longblob 写入文件

标签 c++ mysql blob mysql-connector

我有一个带有 longblob 字段的 mysql 表。我已经成功地将 blob 记录插入到表中,并使用 python 将它们提取回磁盘上的文件中。

现在我想从表中选择最新版本的 blob,并使用 C++ 和 mysql 连接器将其写入磁盘上的文件。这是我到目前为止的代码。

它似乎适用于较小的 blob,但不适用于我数据库中的大 blob。 最大缓冲区大小似乎接近 1000000。

如何从 mysql select 写入大型 longblob 文件?

string appname = "rocket.exe"; 

driver = get_driver_instance();
con = driver->connect(mysql_server, mysql_user, mysql_password);
con->setSchema("app");
stmt = con->createStatement();

sqlstring =
    "select installer"
    "  from app_table"
    " where appname = '" + appname + "'"
    "   order by version desc "
    " limit 1";  

std::istream *blob;
res = stmt->executeQuery(sqlstring);
while (res->next()) {
    blob = res->getBlob("installer");
}

char buffer[1000000];
memset(buffer, '\0', 1000000);
blob->read((char*)buffer,1000000);   

std::ofstream outfile ("rocket2.exe",std::ofstream::binary);
outfile.write (buffer,1000000);
outfile.close();

delete res;   // resultset
delete stmt;  // statement
delete con;   // connection 

最佳答案

那是一个很大的缓冲区。您可能用完了堆栈空间。通过添加一些内存管理或使用 vector 来分配到堆。你说你可以使用大约 1000000。这里的可变性是由于堆栈空间被其余代码使用。

#include <vector>;
std::vector<char> buffer(1000000, '\0');
blob->read(&buffer[0], buffer.size());

有关堆栈内存与堆内存的更多信息,请查看 here , 和 here

关于c++ - 从 C++ mysql 连接器选择将 longblob 写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19166612/

相关文章:

c++ STL库这些带下划线的方法是什么?

php - 为 AJAX-PHP-MySQL 生成的表创建动态 Div 标签

MySQL基于不同时间段的流行行数

php - MySQL连接2个表但重命名列,因为它们具有相同的名称

ruby - 如何使用 Ruby 和 Sequel 将图像存储在数据库中?

c++ - 数组应该在 C++ 中使用吗?

c++ - 如果我们使用 SFINAE 匹配类型,则完全失败

c++ - 实现具有不同大小元素的字符串数组

blob - Plone 4 - 获取 plone.app.blob.field.FileField 中文件的 url

grails - Grails:在GORM中持久保存 HashMap 的最简单方法