从 C++ MySQL 连接器选择将 Longblob 写入文件
write longblob to file from c++ mysql connector select
我有一个带有长blob字段的mysql表。 我已经成功地将 blob 记录插入到表中,并使用 python 将它们提取回磁盘上的文件中。
现在,我想从表中选择最新版本的 blob,并使用 c++ 和 mysql 连接器将其写入磁盘上的文件。 这是我到目前为止的代码。
它似乎适用于较小的 blob,但对于我的数据库中的大型 blob 来说还不够。最大缓冲区大小似乎接近 1000000。
如何从 mysql 选择中写入大型长blob文件?
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, ' ', 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, ' ');
blob->read(&buffer[0], buffer.size());
有关堆栈与堆内存的更多信息,请查看此处和此处
其中定义了缓冲区:
std::vector<char> buffer(1000000, ' ');
blob->read(&buffer[0], buffer.size());
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- 从 C++ MySQL 连接器选择将 Longblob 写入文件