windows下安装配置postgreSQL
2018-05-28 23:27 清晨、午后 阅读(1037) 评论(0) 编辑 收藏 举报1.下载 postgresql-10.4-1-windows-x64.exe 进行安装
2.环境配置
(1)文本使用的IDE是VS2010,我们需要配置包含目录(include)、库目录(lib)、链接器输入附加依赖(libpq.lib
);
(2)工程目录下需要加入4个dll文件(libeay32.dll
、libintl-8.dll
、libpq.dll
、ssleay32.dll、libiconv-2.dll
),这些文件都能在PostgreSQL安装目录下(D:\Program Files\PostgreSQL\10\bin)找到;
(3)工程cpp文件中加入头文件#include <libpq-fe.h>
,libpq-fe.h
头文件包含了API接口函数声明及注释,下面介绍的函数在libpq-fe.h
中都能找到。
3.连接数据库
(1)数据库连接函数
extern PGconn *PQsetdbLogin(const char *pghost, const char *pgport, const char *pgoptions, const char *pgtty, const char *dbName, const char *login, const char *pwd); 返回值PGconn *指针,即连接指针。如果你要对PQsetdbLogin函数封装的话,记得将形参连接指针设成PGconn *&引用类型,因为连接函数需要对连接指针修改,而不是修改对象! pghost:主机地址,本机为127.0.0.1或localhost; pgport:端口值,一般为5432; pgoptions:额外选项,NULL即可; pgtty:NULL即可; dbName:数据库名; user:用户名; pwd:密码;
示例:
int connect() { //连接数据库的两种方式 //设置为自己postgresql的数据库名 用户名和密码 //conn = PQconnectdb("host=localhost port=5432 dbname=postgres user=postgres password=123456"); conn = PQsetdbLogin("localhost", "5432", NULL, NULL, "postgres", "postgres", "123456"); if (PQstatus(conn) != CONNECTION_OK) { cout << "connection error" << endl; return -1; } else { cout << "connection success" << endl; return 0; } }
(2)错误显示函数
extern char *PQerrorMessage(const PGconn *conn) 当连接有误时,可以使用PQerrorMessage函数显示出错信息。
示例:
cout<<PQerrorMessage(conn)<<endl;
(3)封装成ConnectToDB
函数
bool ConnectToDB(PGconn *&conn,char *pghost,char *pgport,char *dbname,char *user,char *pwd) { //pgoptions、pgtty参数默认为NULL char *pgoptions,*pgtty; pgoptions=NULL; pgtty=NULL; conn=PQsetdbLogin(pghost,pgport,pgoptions,pgtty,dbname,user,pwd); if(PQstatus(conn)==CONNECTION_BAD) // or conn==NULL { cout<<"Connection db "<<dbname<<" failed!"<<endl; cout << PQerrorMessage(conn) << endl; /* 如果连接失败则输出错误信息 */ return false; } else { cout<<"Connection db "<<dbname<<" success!"<<endl; return true; } }
4、执行SQL语句
执行SQL语句主要是增删改查,只有查询会返回有效记录集。
示例表为:
(1)SQL执行函数
extern PGresult *PQexec(PGconn *conn, const char *query) 返回值PGresult *:查询集指针; conn:连接指针; query:SQL语句;
示例:
char query[256] = {"SELECT a, b FROM public.aaa "}; res = PQexec(conn, query);
(2)元组数函数
extern int PQntuples(const PGresult *res) 返回值:查询集中记录数; res:查询集指针;
示例:
int tuple_num = PQntuples(res);
(3)字段数函数
extern int PQnfields(const PGresult *res) 返回值:每条记录中列数(字段数); res:查询集指针;
示例:
int field_num = PQnfields(res);
(4)取值函数
extern char *PQgetvalue(const PGresult *res, int tup_num, int field_num); 返回值:查询集中每个位置的值; res:查询集指针; tup_num:行号,从0开始; field_num:列号,从0开始;
5、关闭连接
(1)查询集清理函数
extern void PQclear(PGresult *res) res:查询集指针;
(2)关闭连接函数
extern void PQfinish(PGconn *conn) conn:连接指针;
6、错误查询
许多时候执行SQL语句后,数据表没有变化,程序也不报错,这种情况很难发现错误。我们需要使用PostgreSQL提供的errorMessage和status函数追踪程序变量的状态。
比如:
(1)PQerrorMessage函数提供了PGconn连接指针的出错信息;
extern char *PQerrorMessage(const PGconn *conn); conn:连接指针
(2)PQresultErrorMessage函数提供了PGresult查询集指针的出错信息;
extern char *PQresultErrorMessage(const PGresult *res); res:查询集指针
(3)PQresultStatus函数返回查询集指针的状态信息ExecStatusType,这是个枚举enum类型:
extern ExecStatusType PQresultStatus(const PGresult *res); res:查询集指针
ExecStatusType的枚举类型:
ypedef enum { PGRES_EMPTY_QUERY = 0, /* empty query string was executed */ PGRES_COMMAND_OK, /* a query command that doesn't return * anything was executed properly by the * backend */ PGRES_TUPLES_OK, /* a query command that returns tuples was * executed properly by the backend, PGresult * contains the result tuples */ PGRES_COPY_OUT, /* Copy Out data transfer in progress */ PGRES_COPY_IN, /* Copy In data transfer in progress */ PGRES_BAD_RESPONSE, /* an unexpected response was recv'd from the * backend */ PGRES_NONFATAL_ERROR, /* notice or warning message */ PGRES_FATAL_ERROR, /* query failed */ PGRES_COPY_BOTH, /* Copy In/Out data transfer in progress */ PGRES_SINGLE_TUPLE /* single tuple from larger resultset */ } ExecStatusType;
封装成ExecSQL函数:
bool ExecSQL(PGconn *conn, const char *sql) { PGresult *res = NULL; if (conn == NULL) { cout << "Conn is null" << endl; return false; } else { res = PQexec(const_cast<PGconn *>(conn), sql); if (res == NULL) { std::cout << PQresultErrorMessage(res) << endl; /* 打印失败原因 */ return PQresultStatus(res); /* 返回错误码 */ } else { // 输出记录 int tuple_num = PQntuples(res); int field_num = PQnfields(res); for (int i = 0; i<tuple_num; ++i) { for (int j = 0; j<field_num; ++j) cout << PQgetvalue(res, i, j) << " "; cout << endl; } //ClearQuery(res); return true; } } }