[原创]libpq-PostgreSQL客户端编程接口(一)----libpq中的数据库连接函数
添加时间:2013-5-9 点击量:
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文件,里面的内容如下:
project(edbconn)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(¥{PROJECT_NAME} ¥{SRC_LIST})
SET(PG_BASE /opt/PostgresPlus/9.2AS)
INCLUDE_DIRECTORIES(¥{PG_BASE}/include)
LINK_DIRECTORIES(¥{PG_BASE}/lib)
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定义为:
char conninfo = hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=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或一个空字符串就可以了。
conn = PQsetdbLogin(localhost,5444,NULL,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。
// 断定与PostgreSQL的连接是否成功
if (PQstatus(conn) != CONNECTION_OK)
{
// do nothing...
}
查询办事器当前的参数设置
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 using namespace std;
4
5 static void exit_nicely(PGconn conn)
6 {
7 PQfinish(conn);
8 }
9
10 int main()
11 {
12 PGconn conn;
13
14 /
15 PGconn PQconnectdb(const char conninfo);
16 /
17
18 //const char conninfo = hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb;
19 // conn = PQconnectdb(conninfo);
20 conn = PQconnectdb(hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb);
21
22 /
23 PGconn PQsetdbLogin(const char pghost,
24 const char pgport,
25 const char pgoptions,
26 const char pgtty,
27 const char dbName,
28 const char login,
29 const char pwd);
30 /
31
32 / Make a connection to the database /
33 //conn = PQsetdbLogin(localhost,5444,NULL,NULL,mydb,enterprisedb,edb);
34
35 / Check to see that the backend connection was successfully made /
36 if (PQstatus(conn) != CONNECTION_OK)
37 {
38 cout << connect failed. PQstatus : << PQstatus(conn) << endl;
39 // char PQerrorMessage(const PGconn conn);
40 cout << PQerrorMessage(conn) << endl;
41 exit_nicely(conn);
42
43 return 0;
44 }
45
46 // PQdb
47 cout << 数据库名 : << PQdb(conn) << endl;
48
49 // PQuser
50 cout << 用户名 : << PQuser(conn) << endl;
51
52 // PQpass
53 cout << 口令 : << PQpass(conn) << endl;
54
55 switch(PQstatus(conn))
56 {
57 case CONNECTION_STARTED:
58 cout << 正在连接... << endl;
59 break;
60
61 case CONNECTION_MADE:
62 cout << 与办事器连接已建树... << endl;
63 break;
64
65 case CONNECTION_AUTH_OK:
66 cout << auth is ok. << endl;
67 break;
68
69 case CONNECTION_OK:
70 cout << connected. << endl;
71 break;
72
73 default:
74 cout << 正在连接... << endl;
75 }
76
77 cout << ---------- 连接状况函数 ---------- << endl;
78 //
79 // PQparameterStatus
80 // server_version , server_encoding, client_encoding, session_authorization, DateStyle, TimeZone, integer_datetimes 和 standard_conforming_strings
81 cout << server_version : << PQparameterStatus(conn,server_version) << endl;
82 cout << server_encoding : << PQparameterStatus(conn,server_encoding) << endl;
83 cout << client_encoding : << PQparameterStatus(conn,client_encoding) << endl;
84 cout << session_authorization : << PQparameterStatus(conn,session_authorization) << endl;
85 cout << DateStyle : << PQparameterStatus(conn,DateStyle) << endl;
86 cout << TimeZone : << PQparameterStatus(conn,TimeZone) << endl;
87 cout << integer_datetimes : << PQparameterStatus(conn,integer_datetimes) << endl;
88 cout << standard_conforming_strings : << PQparameterStatus(conn,standard_conforming_strings) << endl;
89
90 // PQprotocolVersion
91 cout << PQprotocolVersion : << PQprotocolVersion(conn) << endl;
92
93 // PQbackendPID
94 cout << PQbackendPID : << PQbackendPID(conn) << endl;
95
96 // PQgetssl
97 cout << PQgetssl : << PQgetssl(conn) << endl;
98
99 PQfinish(conn);
100
101 return 0;
102 }
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文件,里面的内容如下:
project(edbconn)
cmake_minimum_required(VERSION 2.8)
aux_source_directory(. SRC_LIST)
add_executable(¥{PROJECT_NAME} ¥{SRC_LIST})
SET(PG_BASE /opt/PostgresPlus/9.2AS)
INCLUDE_DIRECTORIES(¥{PG_BASE}/include)
LINK_DIRECTORIES(¥{PG_BASE}/lib)
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定义为:
char conninfo = hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=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或一个空字符串就可以了。
conn = PQsetdbLogin(localhost,5444,NULL,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。
// 断定与PostgreSQL的连接是否成功
if (PQstatus(conn) != CONNECTION_OK)
{
// do nothing...
}
查询办事器当前的参数设置
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 using namespace std;
4
5 static void exit_nicely(PGconn conn)
6 {
7 PQfinish(conn);
8 }
9
10 int main()
11 {
12 PGconn conn;
13
14 /
15 PGconn PQconnectdb(const char conninfo);
16 /
17
18 //const char conninfo = hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb;
19 // conn = PQconnectdb(conninfo);
20 conn = PQconnectdb(hostaddr=127.0.0.1 port=5444 dbname=mydb user=enterprisedb password=edb);
21
22 /
23 PGconn PQsetdbLogin(const char pghost,
24 const char pgport,
25 const char pgoptions,
26 const char pgtty,
27 const char dbName,
28 const char login,
29 const char pwd);
30 /
31
32 / Make a connection to the database /
33 //conn = PQsetdbLogin(localhost,5444,NULL,NULL,mydb,enterprisedb,edb);
34
35 / Check to see that the backend connection was successfully made /
36 if (PQstatus(conn) != CONNECTION_OK)
37 {
38 cout << connect failed. PQstatus : << PQstatus(conn) << endl;
39 // char PQerrorMessage(const PGconn conn);
40 cout << PQerrorMessage(conn) << endl;
41 exit_nicely(conn);
42
43 return 0;
44 }
45
46 // PQdb
47 cout << 数据库名 : << PQdb(conn) << endl;
48
49 // PQuser
50 cout << 用户名 : << PQuser(conn) << endl;
51
52 // PQpass
53 cout << 口令 : << PQpass(conn) << endl;
54
55 switch(PQstatus(conn))
56 {
57 case CONNECTION_STARTED:
58 cout << 正在连接... << endl;
59 break;
60
61 case CONNECTION_MADE:
62 cout << 与办事器连接已建树... << endl;
63 break;
64
65 case CONNECTION_AUTH_OK:
66 cout << auth is ok. << endl;
67 break;
68
69 case CONNECTION_OK:
70 cout << connected. << endl;
71 break;
72
73 default:
74 cout << 正在连接... << endl;
75 }
76
77 cout << ---------- 连接状况函数 ---------- << endl;
78 //
79 // PQparameterStatus
80 // server_version , server_encoding, client_encoding, session_authorization, DateStyle, TimeZone, integer_datetimes 和 standard_conforming_strings
81 cout << server_version : << PQparameterStatus(conn,server_version) << endl;
82 cout << server_encoding : << PQparameterStatus(conn,server_encoding) << endl;
83 cout << client_encoding : << PQparameterStatus(conn,client_encoding) << endl;
84 cout << session_authorization : << PQparameterStatus(conn,session_authorization) << endl;
85 cout << DateStyle : << PQparameterStatus(conn,DateStyle) << endl;
86 cout << TimeZone : << PQparameterStatus(conn,TimeZone) << endl;
87 cout << integer_datetimes : << PQparameterStatus(conn,integer_datetimes) << endl;
88 cout << standard_conforming_strings : << PQparameterStatus(conn,standard_conforming_strings) << endl;
89
90 // PQprotocolVersion
91 cout << PQprotocolVersion : << PQprotocolVersion(conn) << endl;
92
93 // PQbackendPID
94 cout << PQbackendPID : << PQbackendPID(conn) << endl;
95
96 // PQgetssl
97 cout << PQgetssl : << PQgetssl(conn) << endl;
98
99 PQfinish(conn);
100
101 return 0;
102 }