我正在用 C 编码并使用 Postgresql 的 Libpq 库,我想将 PNG 图像以“bytea”类型存储到数据库中。我在网上搜索了几个小时,找不到一个很好的例子来处理这项工作,所以想写在这里并寻求你的帮助。
我有 12 个要绑定的参数,其中一个是 PNG 图像。其余的是 char*,它们没有问题。
以下是我到目前为止所尝试的。(我正在编写代码的必要部分):
PGresult *res;
PGconn *conn;
const char *paramValues[12];
int paramLengths[12];
int paramFormats[12];
const char* imageFrame=frameImageArray.data();// frameImageArray.data is const char*.
int imageSize=frameImageArray.size();
paramFormats[11]=1;
paramLengths[11]=imageSize;
paramValues[11]= imageFrame;
// insertplate is a function on db
res = PQexecParams(conn,
"SELECT insertplate($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12)",
12, // param number
NULL, // oid param type
paramValues, // param values
paramLengths, // param lengths
paramFormats, // params format, 1 for binary
1); //1 for binary result
它编译没有问题,但是在运行时将图像存储到数据库时,会发生经典的运行时错误:
“..._debug.exe 中 0x6d3dc220 处的未处理异常:0xC0000005:访问冲突读取位置 0x000000007f91e508。”
似乎与内存处理有关。
无论我尝试了什么,我都无法让它运行,也看不到我的错误。我是否必须使用 Oids 通过 PQexecParams 将二进制数据发送到 db?还是我缺少的其他东西?如果有人帮助我,我真的很感激。
提前致谢。
编辑:我刚刚意识到,如果我使用 Insert 语句,它工作得很好,但这个函数没有。通常它可以工作。奇怪的。