位置:首頁 > 數據庫 > PostgreSQL教學 > PostgreSQL連接C/C++接口實例

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