2013-03-14 34 views
0

我使用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?還是我失蹤的其他東西?如果有人幫助我,我真的很感激。

在此先感謝。

編輯:我剛剛意識到,如果我使用插入語句,它運作良好,但此功能不。通常它工作。奇怪的。

+1

這段代碼看起來不錯。文檔中記錄了'paramTypes'中的NULL。假設'imageSize'和'imageFrame'是正確的,我會在其他參數中搜索崩潰的原因。有關S.O的示例,另請參閱[另一個問題](http://stackoverflow.com/questions/8994702)。 – 2013-03-14 15:21:43

+0

imageSize和imageFrame是圖像數據的正確字符指針。其實我在這個例子中做了同樣的事情,但沒有工作。仍然找不到原因。順帶感謝你的興趣。 – Horizon1710 2013-03-14 16:08:06

回答

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,它工作。我沒有想到這樣的事情。

相關問題