程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 循序漸進PostgreSQL: 學習pqxx C++ API訪問

循序漸進PostgreSQL: 學習pqxx C++ API訪問

編輯:C++入門知識

1. 簡介
習慣了c++來開發的人,可能更傾向於使用c++庫來訪問PG。libpqxx很早以前就推出了。目前已經到了4.0版。本文就簡單的介紹如何使用它,linux平台編譯相對簡單,這裡就介紹一下windows平台下的使用。
 由於libpqxx對libpq的C-API進行了很好的封裝,從而可以節省大量的編碼時間。

2. 編譯過程
將libpqxx解壓到一固定目錄。你需要提前編譯好或安裝好的客戶端庫,通常為了方便,這裡假定你已經有一個PG的安裝版或者解壓縮版,在c:\pgsql裡頭。以PG9.x為例。
1. 進入libpqxx源碼目錄,備份並修改win32\common文件,將PGSQLSRC的值指向正確的地方:
    這裡是PGSQLSRC="c:\pgsql"
    後邊還有很多目錄位置需要調整,針對我們這種情況,通常都是保留安裝版本的設置,如:LIBPQINC=$(PGSQLSRC)\include, 而注釋掉#LIBPQINC=$(PGSQLSRC)\interfaces\libpq, 其它幾個值都如此類推。

2. 拷貝一些編譯相關的頭文件
    針對具體版本,9.0的,將config\sample-headers\libpq\9.0\pqxx復制到include下邊
    針對VS2008的,將config\sample-headers\compiler\VisualStudio2008\pqxx復制到include目錄下邊, 如果是VS2005,以此類推。

3. 編譯
    program files->VS2008-->Visual studio tools->Visual Studio 2008 Command Prompt, 進入命令行, 在此進入libpqxx的源代碼根目錄,執行:
    nmake /f win32\vc-libpqxx.mak ALL,
    得到如下中間過程:
 
        link.exe kernel32.lib ws2_32.lib advapi32.lib /nologo /dll /machine:I386
 shell32.lib secur32.lib wldap32.lib /libpath:"C:\hisql-x86-2.0.1"\lib libpq.lib
  "ObjDllRelease\binarystring.obj"  "ObjDllRelease\connection.obj"  "ObjDllRelea
se\connection_base.obj"  "ObjDllRelease\cursor.obj"  "ObjDllRelease\dbtransactio
n.obj"  "ObjDllRelease\errorhandler.obj"  "ObjDllRelease\except.obj"  "ObjDllRel
ease\field.obj"  "ObjDllRelease\largeobject.obj"  "ObjDllRelease\nontransaction.
obj"  "ObjDllRelease\notification.obj"  "ObjDllRelease\notify-listen.obj"  "ObjD
llRelease\pipeline.obj"  "ObjDllRelease\prepared_statement.obj"  "ObjDllRelease\
result.obj"  "ObjDllRelease\robusttransaction.obj"  "ObjDllRelease\statement_par
ameters.obj"  "ObjDllRelease\strconv.obj"  "ObjDllRelease\subtransaction.obj"  "
ObjDllRelease\tablereader.obj"  "ObjDllRelease\tablestream.obj"  "ObjDllRelease\
tablewriter.obj"  "ObjDllRelease\transaction.obj"  "ObjDllRelease\transaction_ba
se.obj"  "ObjDllRelease\tuple.obj"  "ObjDllRelease\util.obj"  "ObjDllRelease\lib
pqxx.obj" /out:"lib\libpqxx.dll" /implib:"lib\libpqxx.lib"
   Creating library lib\libpqxx.lib and object lib\libpqxx.exp
   最終會在lib目錄下生成:
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0>dir/b/s lib
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpq.dll
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpq.lib
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.dll
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.dll.manifest
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.exp
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx.lib
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.dll
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.dll.manifest
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.exp
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.ilk
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.lib
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxxD.pdb
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx_static.lib
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\libpqxx_staticD.lib
D:\Projects\hisql.svn\trunk\learning\libpqxx-4.0\lib\msdia80.dll

下邊來看看最簡單的示例:
iihero=# create user foo password 'foo1';
CREATE ROLE
iihero=> create table t(id int primary key, col2 varchar(32));
注意:  CREATE TABLE / PRIMARY KEY 將要為表 "t" 創建隱含索引 "t_pkey"
CREATE TABLE
iihero=> \encoding
GBK
iihero=> insert into t values(1 ,'不同類型的列表');
INSERT 0 1
iihero=> select * from t;
 id |      col2
----+----------------
  1 | 不同類型的列表
(1 行記錄)

將編譯出來後的include, lib目錄提取到固定的目錄,與你原來的postgresql的include和lib目錄,可以合到一起。給開發使用。
下邊是一個最簡單的示例:
#include <iostream>

#include <pqxx/pqxx>

int main()
{
 pqxx::connection conn("dbname=iihero hostaddr=127.0.0.1 user=foo password=foo1" );
 if(conn.is_open())
 {
  std::cout << "Connection succesful!" << std::endl;
  std::cout << conn.options()<<std::endl;
 } www.2cto.com
 else
 {
  std::cout << "Something went wrong... oops" << std::endl;
 }
 pqxx::work w(conn);
    pqxx::result res = w.exec("SELECT 1");
    w.commit();

 std::cout << res[0][0].as<int>() << std::endl;
}


需要注意的是,要將libpq.lib, libpqxx.lib, 以及頭文件都設置上。如果動態庫鏈接方式出現問題,可以嘗試使用libpqxx的靜態庫。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved