如何在C中的PQexecParams()中使用多个变量

如何在C中的PQexecParams()中使用多个变量,c,postgresql-9.5,C,Postgresql 9.5,我正在尝试创建一个客户机/服务器应用程序,但是在服务器应用程序中遇到了一个问题。我希望服务器应用程序从客户端应用程序接受包含多个变量的结构,然后在“INSERT-INTO”psql语句中使用这些变量值。然而,正如标题所示,我对如何编写代码有一个问题。以下是我的代码的相关部分: struct PersonInfo* buffer = (struct PersonInfo*)malloc(sizeof(struct PersonInfo)); recv(serv_sock_accept, bu

我正在尝试创建一个客户机/服务器应用程序,但是在服务器应用程序中遇到了一个问题。我希望服务器应用程序从客户端应用程序接受包含多个变量的结构,然后在“INSERT-INTO”psql语句中使用这些变量值。然而,正如标题所示,我对如何编写代码有一个问题。以下是我的代码的相关部分:

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()语句,那么数据库将创建三个单独的条目,而不是一个条目


非常感谢你们迄今为止为我提供的所有帮助

这是可以做到的,但不是以你试图做到的方式。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;

注意-这段代码假设所有三个字段都是char*,我意识到这是一个相当大的“年龄”假设。如果它是一个
int
,则必须解决如何将其转换为字符串,或者如何使用该函数提供的二进制模式。不过,我认为这超出了这个问题的范围。

您好,非常感谢您的意见,我非常感谢。我试着做你提到的事情,但如果我将值声明为“char*values[3]”,我会收到一条编译器警告,指出“正在从不兼容的指针类型、值传递'PQexecParams'的参数5”。但是,如果我将值声明为“const char*values[3]”,则不会收到任何编译器警告,并且它可以正常编译。但是,当我从客户端应用程序调用服务器时,psql语句不会执行。有什么想法吗?整个错误行是什么,通常不兼容的指针错误会告诉您它期望的是什么和得到的是什么“注意:应该是'const char*const*',但参数的类型是'char**'extern PGresult*PQexecParams(PGconn*conn)