2016-10-01 47 views
1

クライアント/サーバーアプリケーションを作成しようとしていますが、サーバーアプリケーションで問題が発生しました。私は、クライアントアプリケーションから複数の変数を含む構造体をサーバアプリケーションが受け入れるようにして、これらの変数値を "INSERT INTO" psql文の中で使用します。しかし、タイトルが示唆するように、私はこれをコード化する方法に問題があります。CのPQexecParams()で複数の変数を使用する方法

struct PersonInfo* buffer = (struct PersonInfo*)malloc(sizeof(struct 
PersonInfo)); 

recv(serv_sock_accept, buffer, sizeof(buffer), 0); 

//**Connection to database using PGconn (PGconn connection)** 

PGresult* res = PQexecParams(connection, 
       "INSERT INTO person(first_name, last_name, age) VALUES($1, $2, $3)", 
       3, 
       NULL, 
       buffer->person.fname, buffer->person.lname, buffer->age, 
       NULL, 
       NULL, 
       0); 

私はこの上で複数の値を宣言することができないと信じて私をリードして、私は私の変数の値を宣言行にコンパイルエラーを得続ける:以下、あなたは私のコードの関連部分を見つけるだろうPQexecParams()関数の行。私は自分のやり方が間違っていると感じているので、あなた方は私に正しい方向を向けることができますか? 1つのPQexecParams()ステートメントのValue行に複数の値を宣言することは可能ですか? 3つの値をPQexecParams()ステートメントに分割すると、データベースは1つではなく3つの別々のエントリを作成します。

ありがとう、皆さんがこれまで私に提供してくれたすべての助けに感謝します!

答えて

1

これは実行できますが、実行しようとしている方法ではありません。あなただけの関数呼び出しに余分な引数を追加し、それはあなたを理解することを期待することはできません

PGresult *PQexecParams(PGconn *conn, 
         const char *command, 
         int nParams, 
         const Oid *paramTypes, 
         const char * const *paramValues, 
         const int *paramLengths, 
         const int *paramFormats, 
         int resultFormat); 

としてPostgreSQLのドキュメントは、その関数のシグネチャを定義します。それはCの仕組みではありません。我々はconstキーワードを見ることができないふりをした場合、我々はその署名を見ればしかし、私たちは

const char * const *paramValues, 

ような値が渡されていることがわかり、これはchar*の配列として渡すことができchar**ですs。

以下のように配列を作成し、複数のフィールドに渡そうとしたところで配列を渡してみてください。

char* values[3]; 
values[0] = buffer->person.fname; 
values[1] = buffer->person.lname; 
values[2] = buffer->person.age; 

は - このコードは、私が「時代」のための非常に大きな仮定で実現する3つのフィールドすべてがchar *であるという仮定を、作ります。 intの場合は、文字列に変換する方法、またはその関数が提供するバイナリモードを使用する方法を検討する必要があります。私はそれがこの質問の範囲を超えていると思う。

+0

あなたのご意見をありがとうございました。本当にありがとうございます。私があなたが言及したことを試みたが、 "char * values [3]"として値を宣言すると、 "互換性のないポインタ型、値から引数 '5を' PQexecParams 'を渡すというコンパイラの警告が出る。しかし、 "const char * values [3]"という値を宣言しても、コンパイラの警告は表示されません。しかし、クライアントアプリケーションからサーバーを呼び出すと、psqlステートメントは実行されません。何か案は? –

+0

エラー行全体は何ですか?通常、互換性のないポインタエラーは、期待しているものとそれが何であるかを教えてくれるでしょう。 –

+0

"期待値 'const char * const *'しかし引数は 'char **' extern PGresult * PQexecParams(PGconn * conn) –

関連する問題