我使用C語言編寫並使用Postgresql的Libpq庫,並且想將PNG圖像以「bytea」類型存儲到數據庫中。我一直在網上搜索幾個小時,並找不到一個很好的例子來處理這項工作,所以想寫在這裏,尋求你的幫助。有關將圖像發送到postgresql db中的bytea列與libpq庫的錯誤
我有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
它編譯沒有問題,但是當涉及到存儲圖像數據庫上運行時,經典的運行時錯誤occures:
「未處理在..._ debug.exe中的0x6d3dc220處出現異常:0xC0000005:訪問衝突讀取位置0x000000007f91e508。「
似乎有關內存處理。
無論我嘗試過什麼,我都無法使其運行,並且無法看到我的錯誤。我是否必須使用Oids將二進制數據發送到具有PQexecParams的db?還是我失蹤的其他東西?如果有人幫助我,我真的很感激。
在此先感謝。
編輯:我剛剛意識到,如果我使用插入語句,它運作良好,但此功能不。通常它工作。奇怪的。
這段代碼看起來不錯。文檔中記錄了'paramTypes'中的NULL。假設'imageSize'和'imageFrame'是正確的,我會在其他參數中搜索崩潰的原因。有關S.O的示例,另請參閱[另一個問題](http://stackoverflow.com/questions/8994702)。 – 2013-03-14 15:21:43
imageSize和imageFrame是圖像數據的正確字符指針。其實我在這個例子中做了同樣的事情,但沒有工作。仍然找不到原因。順帶感謝你的興趣。 – Horizon1710 2013-03-14 16:08:06