使用libpq库将图像发送到postgresql db中的bytea列时出错

时间:2013-03-14 14:18:02

标签: c postgresql libpq bytea

我在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语句,它运行良好,但这个功能没有。通常它有效。奇怪的。

1 个答案:

答案 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并且它有效。我没想到会有这样的事情。