2016-10-01 16 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()语句中的Value行上声明多个值?如果我将三个值分解为他们自己的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**秒。

尝试按如下所示创建数组,然后将其传递到您尝试传入多个字段的位置。

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

注意 - 此代码假设所有三个字段是字符*,这我知道是“年龄”一个相当大的假设。如果它是一个int,您将不得不计算如何将其转换为字符串,或者如何使用该函数提供的二进制模式。然而,我认为这超出了这个问题的范围。

+0

嗨,非常感谢您的意见,我非常感谢。我试着做你提到的,但是如果我将值声明为“char * values [3]”,我得到一个编译器警告,声明“从不兼容的指针类型值中传递'PQexecParams'的参数5”。但是,如果我将值声明为“const char * values [3]”,则不会收到编译器警告,并且编译得很好。但是当我从客户端应用程序调用服务器时,psql语句不会执行。有任何想法吗? –

+0

什么是整个错误行,通常是不兼容的指针错误告诉你它期望什么,它得到了什么 –

+0

“note:expected'const char * const *'但参数的类型是'char **'extern PGresult * PQexecParams(PGconn *康恩) –

相关问题