訪問PostgreSQL:C語言介面

來源:互聯網
上載者:User

C語言介面

  在與資料庫連接方面,C語言是一種常用語言,許多資料庫都是用C寫的。該語言高效靈活,因此如果想要寫一款用戶端介面,不管是僅僅包含控制台還是基於GUI的,並且不想用到瀏覽器,C語言也許是最好的選擇。

  串連C語言與Postgres使用的庫名為libpq,它與PostgreSQL源碼樹綁定在一起。如果安裝資料庫系統時使用的是二進位檔案而不是從源碼編譯安裝,libpq可被單獨安裝,但也要記得需要使用選項-dev package(或-devel,取決於Linux系統的版本)。在Debian及其分發版上,安裝libpq的命令為 #aptitude install libpq-dev。在基於RedHat的系統上,如CentOS,可以在postgresqlxx-libs包中找到libpq,其中xx為主要和次要版本號碼。因此要串連到PostgreSQL
9.1資料庫,如果使用Fedora16,則需要安裝postgresql91-lib或postgresql-devel。由於RHEL/CentOS使用者大多使用Postgres庫,導致程式的名稱可能會有一些不同,而且由於Fedora使用者能夠使用更多最新的包,因此僅僅在使用一箇舊版本時才需要第三方庫。簡而言之,任何支援PostgreSQL的系統均有其可用的libpq。

  除了C語言,libpq同時也是C++、Perl和Tcl的API引擎,提供基本的函數對資料庫進行串連、查詢和修改。許多常用的函數都包含“PQ”首碼,如PQconnectdb或PQerrormessage。更多樣本可查看PostgreSQL文檔或查看src/test/examples。在C程式檔案中,包含libpq-fe.h標頭檔並在編譯時間添加相應的連結標記-lpq。

  安裝並設定好之後,要做的第一件事就是串連資料庫。PQconnectdb()函數帶一個char *conninfo格式的參數,參數格式如dbname=[database_name],當然也可以是其他內容,只要格式對即可,最常用的關鍵字為host,hostaddr(numeric格式,以避免無用的DNS查詢),port,user,password與sslmode。如果不使用參數,則會使用預設選項。假設伺服器位址為192.168.0.101,username為postgres,資料庫名為testdb1,嘗試串連資料庫的代碼如下所示:

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

int main(int argc,char* argv[])
{
    const char *conninfo;
    PGconn *conn;
    if (argc > 1)
        conninfo = argcv[1];
    else
    {
        printf("Not enough arguments, exiting...");
        return 1;
    }
    conn = PQconnectdb(conninfo);
    /*Check to see how I did */
    if(PQstatus(conn) == CONNECTION_OK)
        printf("Connection succeeded.\n");
    else
    {
        printf("Connection failed.\n");
    }
}

linux下postgresql的c程式編譯問題

linux下c程式使用postgresql 8.4串連資料庫時編譯出現的問題。

1. 

問題:In function `main':

`PGconn' undeclared (first use in this function)

`PGresult' undeclared (first use in this function)

`CONNECTION_BAD' undeclared (first use in this function)

`PGRES_COMMAND_OK' undeclared (first use in this function)

`PGRES_TUPLES_OK' undeclared (first use in this function)

出現此問題,為缺少#include <libpq-fe.h>

2.

問題:libpq-fe.h: No such file or directory
解決:系統未尋找到libpq-fe.h,需要指定其目錄
方式1:gcc -c -I/usr/local/pgsql/include test.c
方式2:Makefile檔案中,CPPFLAGS += -I/usr/local/pgsql/include

3.編譯.c至.o通過,但連結時出現如下問題
In function `main':

undefined reference to `PQsetdbLogin'

undefined reference to `PQstatus'

undefined reference to `PQerrorMessage'

解決:此為缺少連結所需的庫檔案導致,需手動指定其目錄

 

gcc -o test test1.o test2.o -L/usr/local/pgsql/lib -lpq

 

 

編譯成功。

將代碼儲存為testlibpq並編譯,編譯後的程式用法如下:

$ testlibpg "hostaddr=192.168.0.101 user=postgres dbname=testdb1"

  如果不出錯誤,會在螢幕上看到提示“Connection succeeded.”,表示串連資料庫成功,不過上文並沒有什麼實際用處。那麼何為實際用處呢----對資料進行查詢,但這裡先介紹如何中斷連線,即調用PQfinish,該函數只有一個參數PGconn *conn,並返回void。

  PQexec函數執行查詢,參數為PGconn *conn與const char *command,返回一個PGresult類型的對象。在如下樣本中,聲明一個PGresult變數,並向伺服器發送一個命令。讀者可自行編寫檢查串連與否以及錯誤處理的代碼。

  PGresult *res;


  res = PQexec(conn, "SELECT * FROM mydatabase");


  PQclear(res);

  顯然這段代碼無法編譯,只是為了向讀者展示libpq庫提供的功能,而不是直接提供可用代碼。不過在這段代碼中,res包含了查詢結果,讀者可以任意對其進行解析。PQresultStatus可以查詢命令的狀態,該函數返回PGRES_COMMAND_OK或 PGRES_FATAL_ERROR.。可在PostgreSQL項目頁面找到exec函數的一個綜合列表。

  下面介紹一些有用的函數,例如,PQntuples函數將給定的res作為參數,以整數類型返回表中列的數量。如果查詢的狀態為PGRES_TUPLES_OK,則它以PGresult對象為參數,並返回一個整型值。PQnfields函數給出每行的列數。PQfname函數返回與某數字關聯的列的名字,PQfnumber函數功能則完全相反。要得到某一單元的值,需要將PGresult以及單元的列號和行號傳給PQgetvalue函數。

  可以看到這些函數都比較簡單,但PQexec不能同時處理多個SQL命令,因為該函數只能返回一個結構,如果有多個命令,則只能返回最後一個命令的結果。另一個不足是,PQexec在執行一個命令時會一直等到命令返回,因此讀者在使用該命令遇到阻塞執行時要分外小心。如果這些不足影響到讀者使用者的使用,可以使用其它函數代替,如PQsendQuery和PQgetResult等,可使用這些函數來進行非同步查詢處理。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.