0

私は C でコーディングしており、Postgresql の Libpq ライブラリを使用しています。PNG 画像を「bytea」タイプのデータベースに保存したいと考えています。私は何時間もネットで検索してきましたが、この作業を処理するための良い例を見つけることができなかったので、ここに書いて助けを求めたいと思いました.

バインドするパラメーターは 12 個あり、そのうちの 1 つは 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.」

メモリ処理についての何かのようです。

何を試しても実行できず、エラーも表示されません。PQexecParams でバイナリ データを db に送信するために Oid を使用する必要がありますか? それとも私が行方不明ですか?誰かがこれを手伝ってくれたら本当に感謝しています。

前もって感謝します。

編集: Insert ステートメントを使用するとうまく機能することに気付きましたが、この機能は機能しません。通常は動作します。変。

4

1 に答える 1

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に設定しましたが、うまくいきました。私はこのようなことを期待していませんでした。

于 2013-03-14T17:04:30.090 に答える