无法使用C将列添加到现有表

时间:2014-04-07 18:03:14

标签: sql c postgresql

以下程序尝试使用包含四个cols(id,lastname,firstname,phonenumber)的表“people”向已存在的数据库插入新行和新列。成功插入行时,不会添加该列。

    #include <stdio.h>
    #include <stdlib.h>
    #include <libpq-fe.h>
    #include <string.h>

    int main() 
    {
     PGconn *conn;
     PGresult *res;
     int rec_count;
     int row;
     int col;

     conn = PQconnectdb("dbname=test host=localhost user=abc1 password=xyz1");

         if(PQstatus(conn) == CONNECTION_BAD) {
             puts("We were unable to connect to the database");
             exit(0);
         }

     res = PQexec(conn,"INSERT INTO people VALUES (5, 'XXX', 'YYY', '7633839276');");
     if(PQresultStatus(res) != PGRES_COMMAND_OK) {
        fprintf(stderr, "Insertion Failed1: %s", PQerrorMessage(conn));
        PQclear(res);
         }
     else
        printf("Successfully inserted value in Table..... \n");

         res = PQexec(conn,"update people set phonenumber=\'5055559999\' where id=3");
     if(PQresultStatus(res) != PGRES_COMMAND_OK) {
        fprintf(stderr, "Insertion Failed2: %s", PQerrorMessage(conn));
        PQclear(res);
         }

     res = PQexec(conn, "ALTER TABLE people ADD comment VARCHAR(100) DEFAULT 'TRUE'");
     if(PQresultStatus(res) != PGRES_COMMAND_OK) {
        fprintf(stderr, "Insertion Failed3: %s", PQerrorMessage(conn));
        PQclear(res);
         }

  rec_count = PQntuples(res);

      printf("We received %d records.\n", rec_count);
      puts("==========================");

      for(row=0; row<rec_count; row++) {
          for(col=0; col<3; col++) {
              printf("%s\t", PQgetvalue(res, row, col));
           }
           puts("");
        }

      puts("==========================");

      PQclear(res);

      PQfinish(conn);

      return 0;
    }

编译和链接后的程序提供以下输出:

    $ ./test
    Successfully inserted value in Table..... 
    We received 0 records.
    ==========================
    ==========================

在postgresql环境中,表“people”会使用额外的行和包含“TRUE”的列进行更新。

这是我用C嵌入postgresql的第一个程序。请帮忙!!

2 个答案:

答案 0 :(得分:0)

这一行:

 res = PQexec(conn, "EXEC('UPDATE people SET comment = ''TRUE'';');");

应该是:

 res = PQexec(conn, "UPDATE people SET comment = 'TRUE'");

EXEC语法是带有ECPG的C语言中嵌入式SQL的一部分。它不会与C libpq library中的PQexec结合使用,这显然是您在使用其余源代码时所使用的内容。

UPDATE没有RETURNING子句的结果还有PQresultStatus(res)==PGRES_COMMAND_OK,而不是PGRES_TUPLES_OK

  

PGRES_COMMAND_OK

Successful completion of a command returning no data.

请参阅Command Execution Functions

您还要测试PGresult返回的任何PQexec,而不仅仅是上次查询的结果,因为任何查询都可能失败。

答案 1 :(得分:0)

如何在不执行SELECT语句的情况下检索数据?

从未使用过PQexec,但我想要添加的代码可能是这样的:

 res = PQexec(conn, "ALTER TABLE people ADD comment VARCHAR(100) DEFAULT 'TRUE'");
 if(PQresultStatus(res) != PGRES_COMMAND_OK) {
    fprintf(stderr, "Insertion Failed3: %s", PQerrorMessage(conn));
    PQclear(res);
 }

//Add PQexec and select statement here.
//Something "like" this.
 res = PQexec(conn, "SELECT * FROM people;");
 if(PQresultStatus(res) != PGRES_TUPLES_OK) {
    fprintf(stderr, "Select Failed: %s", PQerrorMessage(conn));
    PQclear(res);
 }

  rec_count = PQntuples(res);

  printf("We received %d records.\n", rec_count);