一、簡介Libpq 是應用程式設計師使用 HGDB 的 C 介面。libpq 是一個庫函式的集合,它們允許客戶端程式傳遞查詢給 HGDB 後端伺服器並且接收這些查詢的結果。libpq庫是PostgreSQL的C介面。它是一組庫函式,允許客戶端程式與PostgreSQL互動。它也是其他PostgreSQL應用程式介面的基礎引擎,包括為C++、Perl、PHP、Ruby、Python和Tcl編寫的應用程式介面。Libpq可能大家以前沒有接觸甚至沒有聽說,那麼其實他和jdbc是一個東西,JDBC(Java DataBase Connectivity,java資料庫連線)是一種用於執行SQL語句的Java API,可以為多種關係資料庫提供統一訪問,它由一組用Java語言編寫的類和介面組成。要在特定資料庫中使用JDBC,我們需要該資料庫的JDBC驅動程式。注意:使用 libpq 的客戶端程式必須包括標頭檔案 libpq-fe.h 並必須與 libpq 庫連結在一起。二、用途簡單地說,Libpq 可做三件事:與資料庫建立連線、傳送 操作資料庫的語句並處理結果。下列程式碼段給出了以上三步的基本示例:
#include <stdio.h> #include <stdlib.h> #include <libpq-fe.h> void do_exit(PGconn *conn) { PQfinish(conn); exit(1); } int main() { //連線資料庫,給出字串 PGconn *conn = PQconnectdb("user=highgo dbname=highgo password=highgo123"); //返回連結資訊 if (PQstatus(conn) == CONNECTION_BAD) { fprintf(stderr, "Connection to database failed: %s\n", PQerrorMessage(conn)); do_exit(conn); } else{ printf(‘連線成功’);}//獲取資料表結果 PGresult *res = PQexec(conn, "SELECT * FROM Cars LIMIT 5"); if (PQresultStatus(res) != PGRES_TUPLES_OK) { printf("No data retrieved\n"); PQclear(res); do_exit(conn); } //將查詢結果輸出 int rows = PQntuples(res); for(int i=0; i<rows; i++) { printf("%s %s %s\n", PQgetvalue(res, i, 0), PQgetvalue(res, i, 1), PQgetvalue(res, i, 2)); } PQclear(res); PQfinish(conn); return 0; } 12345678910111213141516171819202122232425262728293031323334353637383940414243444546
三、增刪改查示例這是我們對資料庫進行的最基本的也是最多的操作,下面給到每一個例子以及用到的函式分析。
#include <stdio.h>#include <libpq-fe.h>int main(void){//連線資料庫 const char* conninfo="host=localhost user=highgo dbname=highgo password=ls123456"; PGconn* conn=PQconnectdb(conninfo); if(PQstatus(conn)==CONNECTION_BAD) { printf("failed to connect database!"); PQfinish(conn); return 1;}//建立表,插入數PGresult *res=PQexec(conn,"create table student (id int,name text)");if(PQresultStatus(res)!=PGRES_COMMAND_OK){printf("create failed!%s \n",PQresultErrorMessage(res));}PQclear(res);res=PQexec(conn,"insert into student values(1,'hanjingyi')");if(PQresultStatus(res)!=PGRES_COMMAND_OK){printf("insert failed!\n");}PQclear(res);res=PQexec(conn,"insert into student values(2,'liushun')");if(PQresultStatus(res)!=PGRES_COMMAND_OK){printf("insert failed\n!");}PQclear(res);//查詢操作res=PQexec(conn,"SELECT * FROM student"); if(PQresultStatus(res)!=PGRES_TUPLES_OK) { printf("SELECT failed!"); PQresultErrorMessage(res); PQclear(res); return 1; } int i=PQntuples(res); int t=PQnfields(res); int s=0;//迴圈取值 for(;s<i;s++) { int k=0; for(;k<t;k++) { printf(“%s %s \n”,PQgetvalue(res,s,k)); } } PQclear(res);//刪除操作res=PQexec(conn,"DELETE FROM student WHERE id=3"); if(PQresultStatus(res)!=PGRES_COMMAND_OK) { printf("DELETE executed failed!%s,\n",PQresultErrorMessage(res)); PQresultErrorMessage(res); PQclear(res); return 1; } else { printf("DELETE operation executed succeed!\n"); PQclear(res); } return 0;}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
四、一些常用函式Pqconnectdb 建立一個數據庫連線PGresult 封裝查詢的結果PQexec()提交了一個sql命令到伺服器然後等待結果。PQresultStatus 返回該命令的結果狀態。PGRES_COMMAND_OK一個不返回資料的命令成功完成。 PGRES_TUPLES_OK 一個返回資料的命令(例如 SELECT 或者 SHOW)成功完成。PQntuples 返回查詢結果中的行(元組)數。PQnfields 返回查詢結果中每一行的列(域)數。PQgetvalue 返回一個 PGresult 的一行的單一域值。PQclear 釋放與一個 PGresult 相關的儲存。每一個命令結果不再需要時應該用 PQclear 釋放。