2016-10-01 7 views
1

Я пытаюсь создать клиент/серверное приложение, однако я столкнулся с проблемой в серверном приложении. Я хочу, чтобы серверное приложение принимало структуру, содержащую несколько переменных, из клиентского приложения, а затем использовало эти значения переменных внутри инструкции «INSERT INTO» psql. Однако, как видно из названия, у меня возникла проблема с тем, как я мог бы это кодировать. Ниже вы найдете соответствующие части моего кода:Как использовать несколько переменных в PQexecParams() в C

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(). Я чувствую, что мой путь неправильный, поэтому вы, ребята, могли бы указать мне в правильном направлении? Можно ли объявить несколько значений в строке значений в одном выражении PQexecParams()? Если я разбиваю три значения на свой собственный оператор PQexecParams(), база данных будет создавать три отдельные записи, а не только одну.

Огромное спасибо за всю помощь, которую вы, ребята, предоставили мне до сих пор!

ответ

1

Это можно сделать, но не так, как вы пытаетесь это сделать. Документация PostgreSQL определяет подпись для этой функции в качестве

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

Вы не можете просто добавить дополнительные аргументы в вызове функции и ожидать, что она тебя понять; это не так, как работает C. Однако, если мы посмотрим на этой подписи, мы видим, что значения передаются как

const char * const *paramValues, 

Если мы делаем вид, что мы не можем видеть const ключевое слово, это char**, который может быть передан в виде массива char* s.

Попробуйте создать массив, как показано ниже, а затем передайте его там, где вы пытались пройти в нескольких полях.

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

Примечание - этот код делает предположение о том, что все три поля являются символ *, который я понимаю, это довольно большое предположение для «возраста». Если это int, вам придется либо решить, как преобразовать его в строку, либо как использовать двоичный режим, предоставляемый этой функцией. Я думаю, что это выходит за рамки этого вопроса.

+0

Привет, большое вам спасибо за ваш вклад, я действительно ценю это. Я попытался сделать то, что вы упомянули, но если я объявляю значения как «char * values ​​[3]», я получаю предупреждение о компиляторе, в котором говорится о передаче аргумента 5 «PQexecParams» из несовместимого типа указателя, значения ». Однако, если я объявляю значения как «const char * values ​​[3]», я не получаю никаких предупреждений компилятора, и он компилируется просто отлично. Но когда я вызываю сервер из своего клиентского приложения, оператор psql не выполняется. Есть идеи? –

+0

Какова вся строка ошибки, обычно несовместимые ошибки указателя сообщают вам, что она ожидает и что она получила –

+0

"note: expected 'const char * const *', но аргумент имеет тип 'char **' extern PGresult * PQexecParams (PGconn * Conn) –