【问题标题】:How to use multiple variables in PQexecParams() in C如何在 C 中的 PQexecParams() 中使用多个变量
【发布时间】:2017-02-09 15:29:50
【问题描述】:

我正在尝试创建客户端/服务器应用程序,但是我在服务器应用程序中遇到了问题。我希望服务器应用程序接受来自客户端应用程序的包含多个变量的结构,然后在“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() 语句中的 Value 行上声明多个值?如果我将这三个值分解为它们自己的 PQexecParams() 语句,数据库将创建三个单独的条目,而不仅仅是一个。

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

【问题讨论】:

    标签: c postgresql-9.5


    【解决方案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;
    

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

    【讨论】:

    • 您好,非常感谢您的意见,非常感谢。我尝试做你提到的事情,但是如果我将值声明为“char * values[3]”,我会收到一个编译器警告,指出“从不兼容的指针类型值传递 'PQexecParams' 的参数 5”。但是,如果我将值声明为“const char* values[3]”,我不会收到编译器警告,并且它编译得很好。但是当我从我的客户端应用程序调用服务器时,psql 语句不会执行。有什么想法吗?
    • 整个错误行是什么,通常不兼容的指针错误会告诉你它期望什么以及它得到了什么
    • "注意:预期为 'const char * const*' 但参数类型为 'char **' extern PGresult *PQexecParams(PGconn *conn)
    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-09-16
    • 2016-02-15
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多