libpq-PostgreSQL客户端编程接口(一)----libpq中的数据库连接函数

前端之家收集整理的这篇文章主要介绍了libpq-PostgreSQL客户端编程接口(一)----libpq中的数据库连接函数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Postgresql作为目前最优秀的跨平台的开源数据库,其介绍及优点这里不再赘述,它能让我以最快的速度忘记my*,ms*。libpq是Postgresql的C应用程序接口,它允许客户程序向Postgresql服务器进程发送查询并获得查询结果。

我的实验环境是:

操作系统:Linux wheezy 3.2.0-4-amd64 #1 SMP Debian 3.2.41-2 x86_64 GNU/Linux
数据库:EnterpriseDB (Postgresql Plus Advanced Server)9.2.1.3
示例语言:c++
工具:cmake2.8.9,g++ (Debian 4.7.2-5) 4.7.2
可能大家只知道Postgresql,对EnterpriseDB则比较陌生,这里简单介绍一下EnterpriseDB。EnterpriseDB是在Postgresql基础上,针对企业级应用进行了专门的优化,同时增加了一系列如动态性能调优(DynaTune)、EDB Loader、高效批量sql处理等高级特性;另外EnterpriseDB与Oracle近乎完美的兼容性以及相对Oracle低廉的价格更是一大亮点,这些优异的特点加上IBM与Redhat的巨额注资,我看好它。EnterpriseDB的libpq与Postgresql开源版本完全一致,所以这里您也可以使用Postgresql
一、准备项目文件CMakeLists.txt,设置libpq的依赖项
使用 libpq 的前端程序必须包括文件 libpq-fe.h 并且必须与 libpq 库链接。我们创建一个简单的示例项目,并且用cmake作为项目管理工具,这样可以同时复习之前介绍过的cmake相关的知识。
创建CMakeLists.txt文件,里面的内容如下:
 
 
  1. project(edbconn)
  2. cmake_minimum_required(VERSION2.8)
  3. aux_source_directory(.SRC_LIST)
  4. add_executable(${PROJECT_NAME}${SRC_LIST})
  5. SET(PG_BASE"/opt/PostgresPlus/9.2AS")
  6. INCLUDE_DIRECTORIES("${PG_BASE}/include")
  7. LINK_DIRECTORIES("${PG_BASE}/lib")
  8. TARGET_LINK_LIBRARIES(${PROJECT_NAME}"${PG_BASE}/lib/libpq.so")
简单解释一下:
INCLUDE_DIRECTORIES("${PG_BASE}/include")
告诉编译器在哪里去找Postgresql的头文件,我的EnterpriseDB安装目录是在/opt/PostgresPlus/9.2AS,INCLUDE_DIRECTORIES("/opt/PostgresPlus/9.2AS/include")这样写也是一样的。
LINK_DIRECTORIES("/opt/PostgresPlus/9.2AS/lib")
告诉编译器外部依赖库,也就是libpq的位置
最后不要忘了告诉编译器依赖项
TARGET_LINK_LIBRARIES(${PROJECT_NAME} "/opt/PostgresPlus/9.2AS/lib/libpq.so")
二、用c++通过libpq连接Postgresql数据库
类似学习一门新的编程语言从hello world!开始,现在先从连接数据库开始。这次demo是用c++作为开发语言,我陆续会写写 C#与Postgresql相关的笔记。
别忘记包含libpq-fe.h头文件
使用libpq连接Postgresql,首先要创建一个PGconn对象。
PGconn *conn;
1、PQconnectdb
定义:PGconn *PQconnectdb(const char *conninfo);
函数PQconnectdb的参数conninfo定义为:
 
 
  1. char*conninfo="hostaddr=127.0.0.1port=5444dbname=mydbuser=enterprisedbpassword=edb";
conninfo字符串指定数据库的连接信息,各参数之间用空格隔开。参数hostaddr指定数据库主机的IP地址,port指定EnterpriseDB的端口,dbname指定连接的数据库,user和password...。
conn = PQconnectdb(conninfo);
2、PQsetlogin
定义:PGconn *PQsetdbLogin(const char *pghost,
const char *pgport,
const char *pgoptions,
const char *pgtty,
const char *dbName,
const char *login,
const char *pwd);
如果没有给固定参数指定默认值,写NULL或一个空字符串就可以了。
 
 
  1. conn=PQsetdbLogin("localhost","5444",NULL,"mydb","enterprisedb","edb");
PQconnectdb和PQsetdbLogin函数区别不大,怎么用方便就怎么用。
三、连接状态函数
1、返回连接建立时的参数,这些值是固定的
返回连接的数据库
char *PQdb(const PGconn *conn);
返回连接的用户名
char *PQuser(const PGconn *conn);
返回连接的密码
char *PQpass(const PGconn *conn);
返回连接的服务器主机名
char *PQhost(const PGconn *conn);
返回连接的端口
char *PQport(const PGconn *conn);
2、返回对PGconn对象操作时的状态数据
返回连接的状态。
ConnStatusType PQstatus(const PGconn *conn);
ConnStatusType的值最常用的两个是CONNECTION_OK或 CONNECTION_BAD。
 
 
  1. //判断与Postgresql的连接是否成功
  2. if(PQstatus(conn)!=CONNECTION_OK)
  3. {
  4. //donothing...
  5. }
查询服务器当前的参数设置
const char *PQparameterStatus(const PGconn *conn,const char *paramName);
参数paramName可使用的值有:server_version,server_encoding, client_encoding, session_authorization, DateStyle, TimeZone, integer_datetimes 和 standard_conforming_strings
 
 
  1. //PQparameterStatus
  2. //
  3. cout<<"server_version:"<<PQparameterStatus(conn,"server_version")<<endl;
  4. cout<<"server_encoding:"<<PQparameterStatus(conn,"server_encoding")<<endl;
  5. cout<<"client_encoding:"<<PQparameterStatus(conn,"client_encoding")<<endl;
  6. cout<<"session_authorization:"<<PQparameterStatus(conn,"session_authorization")<<endl;
  7. cout<<"DateStyle:"<<PQparameterStatus(conn,"DateStyle")<<endl;
  8. cout<<"TimeZone:"<<PQparameterStatus(conn,"TimeZone")<<endl;
  9. cout<<"integer_datetimes:"<<PQparameterStatus(conn,"integer_datetimes")<<endl;
  10. cout<<"standard_conforming_strings:"<<PQparameterStatus(conn,"standard_conforming_strings")<<endl;
返回连接中操作产生的最近的错误信息。
char *PQerrorMessage(const PGconn *conn);
返回当前连接的进程ID(PID)
int PQbackendPID(const PGconn *conn);
到这里,已经可以通过libpq连接到Postgresql数据库了。
 
 
  1. #include<iostream>
  2. #include"libpq-fe.h"
  3. usingnamespacestd;
  4. staticvoidexit_nicely(PGconn*conn)
  5. {
  6. PQfinish(conn);
  7. }
  8. intmain()
  9. {
  10. PGconn*conn;
  11. /*
  12. *PGconn*PQconnectdb(constchar*conninfo);
  13. */
  14. //constchar*conninfo="hostaddr=127.0.0.1port=5444dbname=mydbuser=enterprisedbpassword=edb";
  15. //conn=PQconnectdb(conninfo);
  16. conn=PQconnectdb("hostaddr=127.0.0.1port=5444dbname=mydbuser=enterprisedbpassword=edb");
  17. /*
  18. *PGconn*PQsetdbLogin(constchar*pghost,
  19. constchar*pgport,
  20. constchar*pgoptions,
  21. constchar*pgtty,
  22. constchar*dbName,
  23. constchar*login,
  24. constchar*pwd);
  25. */
  26. /*Makeaconnectiontothedatabase*/
  27. //conn=PQsetdbLogin("localhost","5444","mydb","enterprisedb","edb");
  28. /*Checktoseethatthebackendconnectionwassuccessfullymade*/
  29. if(PQstatus(conn)!=CONNECTION_OK)
  30. {
  31. cout<<"connectFailed.PQstatus:"<<PQstatus(conn)<<endl;
  32. //char*PQerrorMessage(constPGconn*conn);
  33. cout<<PQerrorMessage(conn)<<endl;
  34. exit_nicely(conn);
  35. return0;
  36. }
  37. //PQdb
  38. cout<<"数据库名:"<<PQdb(conn)<<endl;
  39. //PQuser
  40. cout<<"用户名:"<<PQuser(conn)<<endl;
  41. //PQpass
  42. cout<<"口令:"<<PQpass(conn)<<endl;
  43. switch(PQstatus(conn))
  44. {
  45. caseCONNECTION_STARTED:
  46. cout<<"正在连接..."<<endl;
  47. break;
  48. caseCONNECTION_MADE:
  49. cout<<"与服务器连接已建立..."<<endl;
  50. break;
  51. caseCONNECTION_AUTH_OK:
  52. cout<<"authisok."<<endl;
  53. break;
  54. caseCONNECTION_OK:
  55. cout<<"connected."<<endl;
  56. break;
  57. default:
  58. cout<<"正在连接..."<<endl;
  59. }
  60. cout<<"----------连接状态函数----------"<<endl;
  61. //
  62. //PQparameterStatus
  63. //server_version,server_encoding,client_encoding,session_authorization,DateStyle,TimeZone,integer_datetimes和standard_conforming_strings
  64. cout<<"server_version:"<<PQparameterStatus(conn,"standard_conforming_strings")<<endl;
  65. //PQprotocolVersion
  66. cout<<"PQprotocolVersion:"<<PQprotocolVersion(conn)<<endl;
  67. //PQbackendPID
  68. cout<<"PQbackendPID:"<<PQbackendPID(conn)<<endl;
  69. //PQgetssl
  70. cout<<"PQgetssl:"<<PQgetssl(conn)<<endl;
  71. PQfinish(conn);
  72. return0;
  73. }

作者:vincent zhang
出处:http://ode.cnblogs.com http://odevincent.blog.51cto.com
Email:wsaspx#hotmail.com

知识共享许可协议


本作品由vincent zhang创作,采用知识共享署名-非商业性使用-禁止演绎 3.0 中国大陆许可协议进行许可。

猜你在找的Postgre SQL相关文章