2013-12-12 81 views
0

我正在使用C程序與Postgres數據庫交談。PostgreSQL&C:如何打印整個PostgreSQL結果

我想創建一個方法,允許用戶在C程序中鍵入一個自定義查詢,並查看Postgres打印在其命令行客戶端psql中打印的結果。

對於其他查詢,我能夠使用我在文檔中找到的函數。麻煩的是,這些只是工作,因爲我知道我需要的列數和相應的頭文件等

例如:

void* executeCustomQuery(const char* query){ 
    PGresult* res = PQexec(conn, query); 
    //print all entries 
    printf(PRODUCTS_TABLE_HEADER); 
    int i; 
    for (i = 0; i < PQntuples(res); i++){ 
     printf("| %s | %s | %s |", PQgetvalue(res, i, 0), PQgetvalue(res, i, 1), PQgetvalue(res, i, 2)); 
    } 
    PQclear(res); 
} 

我不能使用這個代碼,如果我不知道是什麼我回來了。

有沒有人知道有任何方式可以打印出Postgres的直接結果?

+0

Postgres的一個很好的「特性」是它的免費/開放源代碼軟件 - 查看'psql'代碼。 –

+0

RTFM。一切都在那裏:http://www.postgresql.org/docs/9.2/static/libpq-exec.html#LIBPQ-EXEC-SELECT-INFO –

+2

我發現後不久發現。 「RTM」雖然可以做到,但不需要那個「F」 – CodyBugstein

回答

1

我最終找到了方法PQfname(),它給了我表的列名稱。 使用這個我可以用一些for循環重建表格。這不是我所期待的,但值得一提。

PGresult* res = PQexec(conn, query); 
    char headerPrint[500]; 
     strcpy(headerPrint, "|"); 
     int h; 
     for (h = 0; h < PQnfields(res); h++){ 
       strcat(headerPrint, " "); 
       strcat(headerPrint, PQfname(res, h)); 
       strcat(headerPrint, " |"); 
       if (h == PQnfields(res)-1){ 
        strcat(headerPrint, "\n"); 
       } 
     } 
     printf("%s", headerPrint); 
     //Print content 
     int i; 
     char resultPrint[500]; 
     strcpy(resultPrint, "|"); 
     for (i = 0; i < PQntuples(res); i++){ 
      int j; 
      for (j = 0; j < PQnfields(res); j++){ 
       strcat(resultPrint, " "); 
       strcat(resultPrint, PQgetvalue(res, i, j)); 
       strcat(resultPrint, " |"); 
       //printf("%s %d %s", "Value of i is: ", i, "\n"); 
       //printf("%s %d %s", "Value of j is: ", j, "\n"); 
       //New line at the end 
       if (j == PQnfields(res)-1){ 
        strcat(resultPrint, "\n"); 
       } 
      } 
      printf("%s", resultPrint); 
      strcpy(resultPrint, "|"); //Clear the current row and start over 
     } 
     PQclear(res); 
+0

讀者還應該看看'PQprint'。 –