PostgreSQL连接C/C++接口实例

来源:互联网 发布:stc单片机iap应用 编辑:程序博客网 时间:2024/05/22 01:28

1http://www.yiibai.com/html/postgresql/2013/080894.html

本教程讲解C/C++连接PostgreSQL,使用libpqxx库,这是官方的C++客户端API用于连接PostgreSQL。libpqxx源代码在BSD许可下,可以免费下载,传递给他人,改变它或出售,它包括在你自己的代码,并分享你的代码更改。

安装

libpqxx最新版本的可供下载链接下载libpqxx。所以下载的最新版本,并遵循以下步骤:Download Libpqxx. 

wget http://pqxx.org/download/software/libpqxx/libpqxx-4.0.tar.gztar xvfz libpqxx-4.0.tar.gzcd libpqxx-4.0./configuremakemake 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 restartStopping postgresql service:                               [  OK  ]Starting postgresql service:                               [  OK  ]

C/C++ APIs

以下是重要接口例程可满足工作需求与PostgreSQL数据库的C/C + +程序。如果正在寻找一个更复杂的应用程序,那么可以寻找到libpqxx官方文档,或者可以使用商用的API。

S.N.API & 描述1pqxx::connection C( const std::string & dbstring )

这是将用于连接到数据库一个类型定义。这里dbstring提供所需要的参数,例如连接到数据库 dbname=testdb user=postgres password=pass123 hostaddr=127.0.0.1 port=5432.

如果连接设置成功,那么它创建C与连接对象提供各种有用的函数公共函数。

2C.is_open()

is_open()是一个连接对象的公共方法,并返回布尔值。如果连接处于活动状态,则此方法返回true,否则返回false。

3C.disconnect()

使用此方法打开的数据库连接断开。

4pqxx::work W( C )

这是一个类型定义将用于创建一个事务对象,使用C连接方式,最终将被用于执行SQL语句的事务模式。

如果交易对象被创建成功,那么它被分配到变量W,这将被用来访问相关的事务性对象的公共方法。

5W.exec(const std::string & sql) 

这种从事务对象的公共方法将被用于执行SQL语句。

6W.commit()

这种从事务对象的公共方法将用于提交事务。

7W.abort()

这种从事务对象的公共方法将用于回滚事务。

8pqxx::nontransaction N( C )

这是一个类型定义,被用来创建使用C连接方式,最终将被用于在非事务性模式下执行SQL语句的非事务性对象。

如果交易对象被创建成功,那么它被分配到变量N将用于访问相关的非事务性对象的公共方法。

9N.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.outOpened 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: testdbTable 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: testdbRecords created successfully

2,

【IT168 技术】在之前的文章《任意语言访问PostgreSQL:C语言接口》中,介绍了如何使用C语言访问PostgreSQL,今天将介绍如何使用C++访问PostgreSQL。

  官方PostgreSQL客户端的C++接口API称为libpqxx,但没有与PostgreSQL源码进行绑定,用户可以从产品分发库或单独下载进行安装。README文件提到用户可以在Linux、BSD、Solaris、Irix、HP-UX、AIX和安装Cygwin的Windows上使用libpqxx。安装libpqxx前要先安装libpq,因为前者是基于后者的。

  在C++中,namespace被命名为pqxx,用户必须包含以该名称命名的头文件。以下为一个简单连接与查询的例子:

#include <iostream>
#include 
<pqxx/pqxx>

using namespace std;

int main()
{
    pqxx::connection conn;
    pqxx::work w(conn);
    pqxx::result res 
= w.exec("SELECT 1");
    w.commit();

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

  如果运行正确,则该程序会打印出“1”,可以使用try/catch关键字来处理连接中可能出现的错误。如果要像在C语言中那样使用argv[x],可以像如下方法连接字符串:

pqxx::result res = w.exec("SELECT" + w.quote(argv[1]));

  那么,该如何对数据进行查询与返回呢?由于保存数据的res变量是一个数组,因此可以利用循环来读取res中的数据元素:

for (int rownr=0; rownr < res.size(); ++rownr)
{
    
const result::tuple row = res[rownr];
    
for (int colnr=0; colnr < row.size(); ++colnr)
    {
        
const result::field = row[colnr];
        cout 
<< field.c_str() << \t;
    }
    cout 
<< endl;
}

  要记得在写代码的时候加上using namespace std;,如果不加的话在编译时会在使用cout与endl的行显示警告。

  libpqxx在字符串转换方面提供大量函数,最有意思的函数为from_string与to_string,第一个函数只有一个字符串参数和一个 T& obj参数,T表示已存在的内置类型,第二个函数只有一个T& obj变量,函数将其转换为字符串。更多详细内容可以阅读相关文档。

  连接,查询与事务处理

  本节的其余部分代码,读者最好使用using namespace pqxx;,因为可以在写代码时免去写一些数据类型,省去一些不必要的麻烦,如可以不必写pqxx::...。现在连接一个数据库,执行一次事务处理,之后进行一次查询,读者会看到代码与前文的C代码不太一样。

  可以使用只包含一个参数的结构,如定义了连接选项(数据库名、用户名等)的字符串。由于默认用户名为postgres,因此本例代码没有包含用户名:

connection Conn("dbname=testdb1 hostaddr=192.168.0.101");

  现在已经打开了一个连接,执行没有出错。不过到目前为止还不能进行查询,还需要使用transactor来打开一个事务处理,这样可以在连接突然断开时省去一些麻烦与时间。transactor是一个functor,如果在创建连接时需要知道连接的状态,则该运算符非常有效,而不能仅仅使用简单的函数或函数指针。

  functor是一个函数对象,可以将其看成一个状态查询函数。例如在C++中操作符“()”可以被重载,因此可以将任意数量的数据元素放到括号中。也许有读者会认为functor是定义操作符()的类,如果想要设计一个函数使两个给定的作为参数的值相加,则必须要对这些值进行硬编码。functor考虑到硬编码的限制,允许用户使用一个结构体,并将一个新对象“覆盖”要相加的第一个值,给开发者更多的灵活性。

  下面看如何使用transactor:

  // 假设已经打开一个连接

class Transaction : public transactor<>
{
public:
     
void operator () (transaction<> & t)
     {
         t.exec (
"INSERT INTO mytable VALUES(val1,val2)");

     }

     
void on_abort (const string & msg)
     {
         cout 
<< "Transaction failed with message: " << msg << endl;
     }
};

  //在 main()函数中

conn.perform (Transaction());

  通过本节内容可以看到,用C++代码对数据库进行查询并不难,用户可以通过定义事务处理(transactions)并适当规范化查询结果(参考stringstream),其余部分可以使用循环来实现。欢迎继续关注《任意编程语言访问PostgreSQL:PHP接口


0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网易手机邮箱手机换了怎么办 崩坏3号被盗了怎么办 qq账号被永久冻结了怎么办 淘宝账号被永久冻结了怎么办 qq账号被永久冻结怎么办 多多理财账号冻结了怎么办 苹果id安全问题忘记了怎么办 网易邮箱帐号忘了怎么办 网易邮箱密码忘记了怎么办 网易邮箱密码忘了怎么办 网易邮箱忘记邮箱账号怎么办 崩坏3三无号被盗怎么办 qq邮箱给58占用怎么办 支付宝邮箱被占用怎么办 苹果手机下载不了qq怎么办 附件预览时发生错误怎么办 手机下载的压缩包打不开怎么办 邮箱提示中转站剩余容量不足怎么办 手机邮箱密码忘记了怎么办 垃圾邮件被系统删除了怎么办 邮箱里的邮件下载不了怎么办 qq邮箱下载不了文件怎么办 苹果手机忘记邮箱密码怎么办 oppo手机安装包损坏怎么办 手机安装包损坏无法安装怎么办 手机qq安装包损坏了怎么办 安装包损坏无法安装怎么办 方舟生存进化安装包损坏怎么办 如果安装包坏了怎么办 酷狗下载音乐收费怎么办 酷狗下载歌曲收费怎么办 酷狗音乐下载歌曲要钱怎么办 酷狗音乐下载要钱怎么办 手机酷狗音乐下载收费怎么办 咪咕视频静音了怎么办 卡西欧自拍神器死机了怎么办 手机一自拍就死机怎么办 微信怎么黑屏了怎么办 宝宝睡袋买大了怎么办 社保中间断了一年怎么办 京东阅读换手机怎么办