PostgreSQL連接C/C++接口實例
本教學講解C/C++連接PostgreSQL,使用libpqxx庫,這是官方的C++客戶端API用於連接PostgreSQL。libpqxx源代碼在BSD許可下,可以免費下載,傳遞給他人,改變它或出售,它包括在你自己的代碼,並分享你的代碼更改。
安裝
libpqxx最新版本的可供下載鏈接下載libpqxx。所以下載的最新版本,並遵循以下步驟:Download Libpqxx.
wget http://pqxx.org/download/software/libpqxx/libpqxx-4.0.tar.gz tar xvfz libpqxx-4.0.tar.gz cd libpqxx-4.0 ./configure make make install
在開始使用C/C++ PostgreSQL界麵,找到PostgreSQL安裝目錄pg_hba.conf文件中添加下麵一行:
# IPv4 local connections: host all all 127.0.0.1/32 md5
可以start/restart Postgres的服務器的情況下,它冇有運行使用下麵的命令:
[root@host]# service postgresql restart Stopping postgresql service: [ OK ] Starting postgresql service: [ OK ]
C/C++ APIs
以下是重要接口例程可滿足工作需求與PostgreSQL數據庫的C/C + +程序。如果正在尋找一個更複雜的應用程序,那麼可以尋找到libpqxx官方文檔,或者可以使用商用的API。
S.N. | API & 描述 |
---|---|
1 |
pqxx::connection C( const std::string & dbstring ) 這是將用於連接到數據庫一個類型定義。這裡dbstring提供所需要的參數,例如連接到數據庫 dbname=testdb user=postgres password=pass123 hostaddr=127.0.0.1 port=5432. 如果連接設置成功,那麼它創建C與連接對象提供各種有用的函數公共函數。 |
2 |
C.is_open() is_open()是一個連接對象的公共方法,並返回布爾值。如果連接處於活動狀態,則此方法返回true,否則返回false。 |
3 |
C.disconnect() 使用此方法打開的數據庫連接斷開。 |
4 |
pqxx::work W( C ) 這是一個類型定義將用於創建一個事務對象,使用C連接方式,最終將被用於執行SQL語句的事務模式。 如果交易對象被創建成功,那麼它被分配到變量W,這將被用來訪問相關的事務性對象的公共方法。 |
5 |
W.exec(const std::string & sql) 這種從事務對象的公共方法將被用於執行SQL語句。 |
6 |
W.commit() 這種從事務對象的公共方法將用於提交事務。 |
7 |
W.abort() 這種從事務對象的公共方法將用於回滾事務。 |
8 |
pqxx::nontransaction N( C ) 這是一個類型定義,被用來創建使用C連接方式,最終將被用於在非事務性模式下執行SQL語句的非事務性對象。 如果交易對象被創建成功,那麼它被分配到變量N將用於訪問相關的非事務性對象的公共方法。 |
9 |
N.exec(const std::string & sql) 從非事務性對象的公共方法將被用於執行SQL語句,並返回一個結果對象,這實際上是一個的迭代器返回的記錄。 |
連接到數據庫
以下C代碼段說明了如何在本地機器上運行端口5432連接到一個現有的數據庫。在這裡用斜線續行。
#include <iostream> #include <pqxx/pqxx> using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { try{ connection C("dbname=testdb user=postgres password=cohondob hostaddr=127.0.0.1 port=5432"); if (C.is_open()) { cout << "Opened database successfully: " << C.dbname() << endl; } else { cout << "Can't open database" << endl; return 1; } C.disconnect (); }catch (const std::exception &e){ cerr << e.what() << std::endl; return 1; } }
現在,讓我們編譯和運行上麵的程序,使用用戶postgres和密碼pass123訪問連接到我們的數據庫testdb。可以使用基於數據庫設置用戶ID和密碼。在給定的順序,記住要保持使用-lpqxx和-plq!否則,鏈接器將提示缺少以"pq"開始的函數名字。
$g++ test.cpp -lpqxx -lpq $./a.out Opened database successfully: testdb
創建表
下麵的C代碼段將被用於先前創建的數據庫中創建一個表:
#include <iostream> #include <pqxx/pqxx> using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { char * sql; try{ connection C("dbname=testdb user=postgres password=cohondob hostaddr=127.0.0.1 port=5432"); if (C.is_open()) { cout << "Opened database successfully: " << C.dbname() << endl; } else { cout << "Can't open database" << endl; return 1; } /* Create SQL statement */ sql = "CREATE TABLE COMPANY(" "ID INT PRIMARY KEY NOT NULL," "NAME TEXT NOT NULL," "AGE INT NOT NULL," "ADDRESS CHAR(50)," "SALARY REAL );"; /* Create a transactional object. */ work W(C); /* Execute SQL query */ W.exec( sql ); W.commit(); cout << "Table created successfully" << endl; C.disconnect (); }catch (const std::exception &e){ cerr << e.what() << std::endl; return 1; } return 0; }
上述程序編譯和執行時,它會在testdb數據庫,並創建COMPANY 表會顯示下麵的語句:
Opened database successfully: testdb Table created successfully
插入操作
下麵的C代碼段顯示了我們如何能夠在上麵的例子中創建COMPANY 表中的記錄:
#include <iostream> #include <pqxx/pqxx> using namespace std; using namespace pqxx; int main(int argc, char* argv[]) { char * sql; try{ connection C("dbname=testdb user=postgres password=cohondob hostaddr=127.0.0.1 port=5432"); if (C.is_open()) { cout << "Opened database successfully: " << C.dbname() << endl; } else { cout << "Can't open database" << endl; return 1; } /* Create SQL statement */ sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" "VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 );"; /* Create a transactional object. */ work W(C); /* Execute SQL query */ W.exec( sql ); W.commit(); cout << "Records created successfully" << endl; C.disconnect (); }catch (const std::exception &e){ cerr << e.what() << std::endl; return 1; } return 0; }
上述程序編譯和執行時,它會創建COMPANY表中的記錄,並會顯示以下兩行:
Opened database successfully: testdb Records created successfully