C++ 如何将二进制文件的全部内容保存到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

我正试图将二进制数据保存到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::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的文档了吗?还有。不,还没有,我会读进去的。这对我很有用。这对我很有用。