【问题标题】:Error about sending an image into bytea column in postgresql db with libpq library使用 libpq 库将图像发送到 postgresql db 中的 bytea 列时出错
【发布时间】:2013-03-02 22:50:03
【问题描述】:

我正在用 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 语句,它工作得很好,但这个函数却不行。通常它可以工作。诡异的。

【问题讨论】:

  • 这段代码 sn-p 看起来不错。 paramTypes 中的 NULL 被记录为可以工作。我会在其他参数中搜索崩溃的原因,假设imageSizeimageFrame 是正确的。另请参阅this other question 以获取有关 S.O. 的示例
  • imageSize 和 imageFrame 是图像数据的正确字符指针。实际上我对那个例子做了同样的事情,但没有工作。还是找不到原因。非常感谢您的关注。

标签: c postgresql libpq bytea


【解决方案1】:

我终于找到了错误。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2016-08-18
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多