我在C中编码并使用Postgresql的Libpq库,我想以“bytea”类型将PNG图像存储到数据库中。我一直在网上搜索几个小时,找不到一个很好的例子来处理这项工作,所以想写在这里并寻求你的帮助。
我有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
编译没有问题但是在运行时将图像存储到db时,会发生经典的运行时错误:
“在..._ debug.exe中0x6d3dc220处的未处理异常:0xC0000005:访问冲突读取位置0x000000007f91e508。”
似乎有关内存处理的事情。
无论我尝试什么,我都无法让它运行,我无法看到我的错误。我是否必须使用Oids通过PQexecParams将二进制数据发送到db?还是别的我错过了什么?如果有人帮我这个,我真的很感激。
提前致谢。
编辑:我刚刚意识到如果我使用Insert语句,它运行良好,但这个功能没有。通常它有效。奇怪的。
答案 0 :(得分:0)
我终于找到了错误。
//paramFormats[0]=0;
//paramFormats[1]=0;
//paramFormats[2]=0;
//paramFormats[3]=0;
//paramFormats[4]=0;
//paramFormats[5]=0;
//paramFormats[6]=0;
//paramFormats[7]=0;
//paramFormats[8]=0;
//paramFormats[9]=0;
//paramFormats[10]=0;
//paramFormats[11]=1;
可以将“参数格式”保留为NULL,但我只想设置“paramFormats [11]”,如上所示。我已经将其他人设置为0并且它有效。我没想到会有这样的事情。