2017-04-06 38 views
0

私はpostgresqlでnewbieで、PQexecparamsでdbに値を挿入しようとしています。私は値を配列内の2つのパラメータをバインドするとき、それは完璧に動作しますが、私は3に移動したときに、エラー が「INSERTに失敗しました:出力バッファ用のメモリを割り当てることができません」と表示さ ここに私のコードです:PQexecparams - バインディング配列の3番目のパラメータをサポートしていません

 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

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

byteaフィールドとして倍精度値のバイナリ表現を格納するためにかなり奇妙ですが、データベースにそれを処理する必要がない場合、 何故なの。そうすれば、精度を失うことはありません。

+0

これを試しましたが、これは前に来たエラーでした: エラー:代入で '<中括弧で囲まれたイニシャライザリスト>'を 'int'に変換できません 2番目のことは、それはシステムのために必要です –

+0

ありがとうあなたは今働いて –

+0

それは可能ですか、またはcharにダブルをキャストする方法はありますか? –

0
paramLengths[3] = 10; 

あなたはparamLengthsに未使用のエントリが割り当てられ、2つのバイナリモードパラメータの2つのエントリが初期化されませんでした。

またdoubleについては、ホストのネイティブフォーマットはバイナリdoubleのためのPostgreSQLのワイヤフォーマットと同じであるを想定しています。そのようにするか、テキスト形式に変換する必要があります。 の場合、values配列に値double*を直接渡す場合は、少なくとも対応する長さフィールドをsizeof(double)に設定する必要があります。

あなたはこのよう paramLengthsを初期化する必要があり
+0

私はそれを挿入する前にdouble *をchar *に変換しました。これをチェックしてください const char * values [3] = {(const char *)valueX、nameString、(const char *)valueY}; それから私はそれを挿入します。デシベルでは、これらの二重のアレイのタイプはここではbytea –

+0

である私の作成テーブルコード: 無効CreateTableForBinary(のPGconn *のCONN) { // SQL文の実行 たPGresult * RES = PQexecの実行(CONN、 " CREATE TABLE testData(IDシリアルプライマリキー、名前テキストNOT NULL、Xバイト、Yバイト) "); if(PQresultStatus(res)!= PGRES_COMMAND_OK) { cout << "testDataテーブルの作成に失敗しました"; PQclear(res); CloseConn(conn); } cout << "testDataテーブルを作成 - OK \ n"; //結果をクリア PQclear(res); } –

+0

@MuhammadMubeenコメントにはコードを投稿しないでください。一般に判読できません。そして、いいえ、あなたのコードはそれらを 'char *'の浮動小数点のテキスト表現に変換せず、それらを 'char *'にキャストするので、誤ったポインタです。文字データではなくバイナリの 'double'を渡しています。これはpostgresやlibpqの問題ではなく、C/C++の問題です。 –

関連する問題