C++ 如何将二进制文件的全部内容保存到postgres数据库中?
我正试图将二进制数据保存到postgres中。部分代码如下所示:C++ 如何将二进制文件的全部内容保存到postgres数据库中?,c++,postgresql,C++,Postgresql,我正试图将二进制数据保存到postgres中。部分代码如下所示: string readFile2(const string &fileName) { ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate); ifs.seekg(0, ios::end); ifstream::pos_type fileSize = ifs.tellg(); ifs.seekg(0, ios::be
string readFile2(const string &fileName)
{
ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);
ifs.seekg(0, ios::end);
ifstream::pos_type fileSize = ifs.tellg();
ifs.seekg(0, ios::beg);
vector<char> bytes(fileSize);
ifs.read(bytes.data(), fileSize);
cout.write(bytes.data(),bytes.size());
cout << "\n";
cout << fileSize;
cout << "\n";
// return bytes.data();
return string(bytes.data(), fileSize);
}
int main() {
string content;
string test = "h";
char test1 = 'C';
try {
cout << "A1 \n";;
content = readFile2("/var/opt/lizardfs/lib/lizardfs/metadata.mfs");
pqxx::connection c("postgresql://mark@localhost:26257/metadata");
pqxx::nontransaction w(c);
w.exec("CREATE TABLE IF NOT EXISTS binary (id INT PRIMARY KEY, meta BLOB)");
w.exec("INSERT INTO binary (id,meta) VALUES (18, '"+content+"')");
}
id | meta
-----+-----------
15 | LIZM 2.9
我认为这是因为下一个字符是空字符。hextump显示00
如果不使用函数return返回字符串(bytes.data(),fileSize),而使用函数return返回字符串(bytes.data(),fileSize)
并返回返回字节.data()代码>然后错误消失。然而,进入数据库,我只能看到二进制文件的前几个字节,如下所示:
string readFile2(const string &fileName)
{
ifstream ifs(fileName.c_str(), ios::in | ios::binary | ios::ate);
ifs.seekg(0, ios::end);
ifstream::pos_type fileSize = ifs.tellg();
ifs.seekg(0, ios::beg);
vector<char> bytes(fileSize);
ifs.read(bytes.data(), fileSize);
cout.write(bytes.data(),bytes.size());
cout << "\n";
cout << fileSize;
cout << "\n";
// return bytes.data();
return string(bytes.data(), fileSize);
}
int main() {
string content;
string test = "h";
char test1 = 'C';
try {
cout << "A1 \n";;
content = readFile2("/var/opt/lizardfs/lib/lizardfs/metadata.mfs");
pqxx::connection c("postgresql://mark@localhost:26257/metadata");
pqxx::nontransaction w(c);
w.exec("CREATE TABLE IF NOT EXISTS binary (id INT PRIMARY KEY, meta BLOB)");
w.exec("INSERT INTO binary (id,meta) VALUES (18, '"+content+"')");
}
id | meta
-----+-----------
15 | LIZM 2.9
我不知道为什么当我有返回bytes.data()时,它不能存储所有二进制内容代码>。如何将二进制文件的全部内容保存到数据库中?而不是
w.exec("INSERT INTO binary (id,meta) VALUES (18, '"+content+"')");
试着做
w.exec_params("INSERT INTO binary (id,meta) VALUES ($1, $2)", 18, content);
而不是
w.exec("INSERT INTO binary (id,meta) VALUES (18, '"+content+"')");
试着做
w.exec_params("INSERT INTO binary (id,meta) VALUES ($1, $2)", 18, content);
使用bytea
而不是BLOB
,然后在插入二进制数据时将其转义,例如:
w.exec("CREATE TABLE IF NOT EXISTS binary (id INT PRIMARY KEY, meta bytea)");
w.exec("INSERT INTO binary (id,meta) VALUES (18, '"+w.esc_raw(content)+"')");
或者,将二进制数据放入
使用bytea
而不是BLOB
,然后在插入二进制数据时将其转义,例如:
w.exec("CREATE TABLE IF NOT EXISTS binary (id INT PRIMARY KEY, meta bytea)");
w.exec("INSERT INTO binary (id,meta) VALUES (18, '"+w.esc_raw(content)+"')");
或者,将二进制数据放入
我在“%”处或附近得到语法错误错误:语法错误详细信息:源SQL:插入二进制(id,meta)值(%s,%s)
,我复制并粘贴。@MarkShaio尝试使用(%s,%s)
,而不是($1,$2)
。有帮助吗?如果没有,请尝试($1::int,$2::bytea)
。告诉我这是否有帮助。出于某种原因,它还在抱怨第一次争论。我做了一个显示metadata.binary中的列,对于id
的INT8
数据类型和meta
@MarkShaio的BYTES
数据类型,你能提供使用($1,$2)
和使用($1::int,$2::bytea)
时显示的全部错误吗?还可以尝试使用不同的类型,例如$2::blob
和$1::int8
。注意到这是我的错误,当我添加$1和$2时,我有一个拼写错误,因此没有语法错误。但是内容仍然只显示了前几个字节LIZM 2.9
我在“%”处或附近得到语法错误错误:语法错误详细信息:源SQL:插入二进制(id,meta)值(%s,%s)
,我复制并粘贴了。@MarkShaio尝试使用($1,$2)代替(%s,%s)
。有帮助吗?如果没有,请尝试($1::int,$2::bytea)
。告诉我这是否有帮助。出于某种原因,它还在抱怨第一次争论。我做了一个显示metadata.binary中的列,对于id
的INT8
数据类型和meta
@MarkShaio的BYTES
数据类型,你能提供使用($1,$2)
和使用($1::int,$2::bytea)
时显示的全部错误吗?还可以尝试使用不同的类型,例如$2::blob
和$1::int8
。注意到这是我的错误,当我添加$1和$2时,我有一个拼写错误,因此没有语法错误。但是内容仍然只显示了前几个字节LIZM 2.9
你看过Postgres文档了吗?还有。还没有,我会读的。你读过Postgres的文档了吗?还有。不,还没有,我会读进去的。这对我很有用。这对我很有用。