【问题标题】:write longblob to file from c++ mysql connector select从c ++ mysql连接器选择将longblob写入文件
【发布时间】:2013-10-03 18:34:16
【问题描述】:

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

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

它似乎适用于较小的 blob,但对于我数据库上的大 blob 来说还不够。 最大缓冲区大小似乎接近 1000000。

如何从 mysql 选择写入大的 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 

【问题讨论】:

  • 我的赏金只是在上面的代码中寻找要替换的代码的 sn-p,这将使其适用于更大的 blob。无需提供整个程序。我上面的作品,只是不适用于非常大的斑点

标签: c++ mysql blob mysql-connector


【解决方案1】:

这是一个很大的缓冲区。您可能用完了堆栈空间。通过添加一些内存管理或使用向量来分配给堆。您说您可以使用大约 1000000。其中的可变性是由于其余代码正在使用堆栈空间。

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

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

【讨论】:

  • 谢谢...有机会我会检查的。希望下周。
【解决方案2】:

缓冲区定义的地方:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-26
    • 2017-02-24
    • 1970-01-01
    • 2012-01-05
    • 2018-04-14
    • 1970-01-01
    • 2013-04-17
    • 2013-05-06
    相关资源
    最近更新 更多