2017-04-06 91 views
0

我是postgresql中的新手,並試圖用PQexecparams在db中插入值。當我綁定在值陣列中的兩個參數,它完美的作品,但是當我移動到三個它顯示了一個錯誤 「INSERT失敗:無法分配輸出緩衝存儲器」 這裏是我的代碼:PQexecparams - 不支持綁定數組中的第三個參數

 void InsertBinaryRec(PGconn *conn, double *valueX, char *nameString, double *valueY) 
{ 

     int paramLengths[10]; 
     int paramFormats[3] = { 1, 0, 1 }; 

     const char* values[3] = {(const char *) valueX, nameString, (const char *) valueY }; 
     cout << "ya phr gya????" << endl; 
     paramLengths[3] = 10 ; 
     PGresult *res = PQexecParams(conn, 
          "INSERT INTO testData (X, NAME, Y) VALUES ($1::bytea, $2::TEXT, $3::bytea)", 
          3,   
          NULL,   
          values, 
          paramLengths, 
          paramFormats, 
          3);   

     if (PQresultStatus(res) != PGRES_COMMAND_OK) 
     { 
       fprintf(stderr, "INSERT failed: %s\n", PQerrorMessage(conn)); 
       PQclear(res); 
       CloseConn(conn); 
     } 
     cout << "Insert testData record - OK\n"; 

    PQclear(res); 
} 
+0

數據庫字段真的是'bytea'嗎? –

+0

是的,我已經設置它bytea –

回答

1

你應該初始化paramLengths這樣的:

int paramLengths[3] = { (int)sizeof(double), 0, (int)sizeof(double) }; 

這是相當奇怪的存儲雙精度值作爲bytea場的二進制表示,但如果你不需要處理它在數據庫, 爲什麼不。這樣你就不會失去精確度。

+0

我試過這個,這是前面出現的錯誤: 錯誤:不能將'<大括號包含的初始化程序列表>'轉換爲'int'賦值 第二件事,我必須將double存儲爲bytea。它是必要的系統 –

+0

謝謝你現在的工作 –

+0

是否有可能或有任何方法來雙重char? –

0
paramLengths[3] = 10; 

你已經在paramLengths中分配了一個未使用的條目,並且保留了未初始化的兩個二進制模式參數的兩個條目。

您也是假設您的主機的本機格式爲double與PostgreSQL的二進制double的連線格式相同。你需要確定是這種情況,或者轉換爲文本格式。如果你將直接在值數組中通過double*值,你至少應該設置對應的長度字段爲sizeof(double)

+0

我已經將double *轉換爲char *,然後再插入它。檢查這個 const char * values [3] = {(const char *)valueX,nameString,(const char *)valueY}; 然後我插入它。以dB爲單位,這些雙陣列的類型是BYTEA –

+0

這裏是我創建表的代碼: 無效CreateTableForBinary(*的PGconn康涅狄格州) { // sql語句執行 的PGresult *解析度=的PQexec(康涅狄格州「 CREATE TABLE testData(ID SERIAL PRIMARY KEY,NAME TEXT NOT NULL,X bytea,Y bytea)「); 如果(!PQresultStatus(RES)= PGRES_COMMAND_OK) { 的cout << 「創建TESTDATA表失敗」; PQclear(res); CloseConn(conn); } cout <<「創建testData表 - 確定\ n」; //清除結果 PQclear(res); } –

+0

@MuhammadMubeen請不要在評論中張貼代碼,它通常是難以辨認的。不,您的代碼不會將它們轉換爲'char *'中的浮動文本表示,您*將它們轉換爲'char *',因此它是錯誤類型的指針。你仍然傳遞二進制'雙',而不是字符數據。這不是postgres或libpq問題,它是一個C/C++問題。 –

相關問題