在 PostgreSQL 中,使用 libpq 库执行查询后,可以一行一行地检索查询结果。以下是一般的步骤:

1. 执行查询:
   PGresult *res = PQexec(conn, "SELECT column1, column2 FROM mytable");

2. 检查查询是否成功:
   if (PQresultStatus(res) != PGRES_TUPLES_OK) {
       fprintf(stderr, "Query execution failed: %s", PQerrorMessage(conn));
       PQclear(res);
       // Handle error
   }

3. 获取查询结果的行数:
   int rows = PQntuples(res);

4. 一行一行地检索结果:
   for (int i = 0; i < rows; ++i) {
       // 获取第 i 行的值
       const char *column1_value = PQgetvalue(res, i, 0);
       const char *column2_value = PQgetvalue(res, i, 1);

       // 处理每一行的值
       printf("Row %d: column1=%s, column2=%s\n", i, column1_value, column2_value);
   }

5. 释放查询结果对象:
   PQclear(res);

注意事项:
  •  PQgetvalue 函数用于获取指定行和列的值,返回的是一个字符串。如果需要按照不同的数据类型获取值,需要进行适当的转换。

  •  注意检查查询执行的状态,确保查询成功执行后再进行结果的处理。

  •  使用 PQclear 释放查询结果对象,以释放相关的内存。


以下是一个完整的例子:
#include <libpq-fe.h>
#include <stdio.h>

int main() {
    const char *conninfo = "dbname=mydatabase user=myuser password=mypassword";
    PGconn *conn = PQconnectdb(conninfo);

    if (PQstatus(conn) != CONNECTION_OK) {
        fprintf(stderr, "Connection to database failed: %s\n", PQerrorMessage(conn));
        PQfinish(conn);
        return 1;
    }

    PGresult *res = PQexec(conn, "SELECT column1, column2 FROM mytable");

    if (PQresultStatus(res) != PGRES_TUPLES_OK) {
        fprintf(stderr, "Query execution failed: %s\n", PQerrorMessage(conn));
        PQclear(res);
        PQfinish(conn);
        return 1;
    }

    int rows = PQntuples(res);

    for (int i = 0; i < rows; ++i) {
        const char *column1_value = PQgetvalue(res, i, 0);
        const char *column2_value = PQgetvalue(res, i, 1);
        printf("Row %d: column1=%s, column2=%s\n", i, column1_value, column2_value);
    }

    PQclear(res);
    PQfinish(conn);

    return 0;
}

这个例子中,连接到数据库后执行了一个简单的查询,并逐行输出查询结果。请根据实际需要进行适当的修改和扩展。


转载请注明出处:http://www.zyzy.cn/article/detail/8373/PostgreSQL