Windows环境C/C++访问PostgreSQL主要有两种方式:利用Qt封装的数据库访问组件、利用PostgreSQL的API函数。使用Qt平台访问PostgreSQL的局限性很大,一旦脱离了访问组件,数据库就无法操作。使用数据库自带的API函数访问数据库具有较好的性能,但是API函数操作、理解比较难,网上相关资料少时需要阅读API文档。

1、环境配置
(1)文本使用的IDE是VS2010,我们需要配置包含目录(include)、库目录(lib)、链接器输入附加依赖(libpq.lib);

(2)工程目录下需要加入4个dll文件(libeay32.dlllibintl.dlllibpq.dllssleay32.dll),这些文件都能在PostgreSQL安装目录下找到;
(3)工程cpp文件中加入头文件#include <libpq-fe.h>libpq-fe.h头文件包含了API接口函数声明及注释,下面介绍的函数在libpq-fe.h中都能找到。

2、连接数据库
(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.1localhost
pgport:端口值,一般为5432;
pgoptions:额外选项,NULL即可;
pgttyNULL即可;
dbName:数据库名;
user:用户名;
pwd:密码;

(2)错误显示函数
extern char *PQerrorMessage(const PGconn *conn)
当连接有误时,可以使用PQerrorMessage函数显示出错信息。

封装成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;
}
}

3、执行SQL语句
执行SQL语句主要是增删改查,只有查询会返回有效记录集。
(1)SQL执行函数
extern PGresult *PQexec(PGconn *conn, const char *query)
返回值PGresult *:查询集指针;
conn:连接指针;
query:SQL语句;
(2)元组数函数
extern int PQntuples(const PGresult *res)
返回值:查询集中记录数;
res:查询集指针;
(3)字段数函数
extern int PQnfields(const PGresult *res)
返回值:每条记录中列数(字段数);
res:查询集指针;
(4)取值函数
extern char *PQgetvalue(const PGresult *res, int tup_num, int field_num);
返回值:查询集中每个位置的值;
res:查询集指针;
tup_num:行号,从0开始;
field_num:列号,从0开始;

封装成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)
{
return false;
}
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;
}
} }

4、关闭连接
(1)查询集清理函数
extern void PQclear(PGresult *res)
res:查询集指针;
(1)关闭连接函数
extern void PQfinish(PGconn *conn)
conn:连接指针;

5、错误查询
许多时候执行SQL语句后,数据表没有变化,程序也不报错,这种情况很难发现错误。我们需要使用PostgreSQL提供的errorMessagestatus函数追踪程序变量的状态。
比如:
(1)PQerrorMessage函数提供了PGconn连接指针的出错信息;
(2)PQresultErrorMessage函数提供了PGresult查询集指针的出错信息;
(3)PQresultStatus函数返回查询集指针的状态信息ExecStatusType,这是个枚举enum类型:

typedef 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;

有了这些工具,发现错不是难事!

最后附上PostgreSQL中文文档:PostgreSQL DocumentAPI接口文档

转载自:http://tanhp.com/index.php/archives/208/

vs2010连接postgresql数据库的更多相关文章

  1. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  2. 视频教程--ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    说好的给园子里的朋友们录制与<ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库> 这篇博客相对应的视频,由于一个月一来没有时 ...

  3. Entity Freamwork 6连接PostgreSql数据库

    原文 Entity Freamwork 6连接PostgreSql数据库 开发环境 VS 2015  Update 1   Postgre Sql 9.4 使用过程 1.使用Nuget在项目中添加对E ...

  4. 在用VS2010连接oracle数据库时ORA-12504错误

    在用VS2010连接oracle数据库时,可能会出现: ORA-12504: TNS: 监听程序在 CONNECT_DATA 中未获得 SERVICE_NAME 只需在web.config文件Data ...

  5. Abp.NHibernate连接PostgreSQl数据库

    Abp.NHibernate动态库连接PostgreSQl数据库 初次接触Abp框架,其框架中封装的操作各类数据的方法还是很好用的,本人还在进一步的学习当中,并将利用abp.NHibernate类库操 ...

  6. typescript-koa-postgresql 实现一个简单的rest风格服务器 —— 连接 postgresql 数据库

    接上一篇,这里使用 sequelize 来连接 postgresql 数据库 1.安装 sequelize,数据库驱动 pg yarn add sequelize sequelize-typescri ...

  7. msf连接PostgreSQL数据库

    一.启动PostgreSQL服务######################################################################?root@root:~# ...

  8. c# vs2010 连接access数据库

    第一次在博客园写博文,由于文采不怎么好,即使是自己很熟悉的东西,写起来也会感觉到不知从何讲起,我想写的多了就好了. 这篇文章主要是介绍怎么用c# 语言 vs2010连接access数据库的,连接字符串 ...

  9. c# vs2010 连接access数据库(转)

    第一次在博客园写博文,由于文采不怎么好,即使是自己很熟悉的东西,写起来也会感觉到不知从何讲起,我想写的多了就好了. 这篇文章主要是介绍怎么用c# 语言 vs2010连接access数据库的,连接字符串 ...

随机推荐

  1. DOCTYPE声明的作用是什么?严格模式与混杂模式如何区分?

    HTML语言已经存在太久了,目前必然会有一些不同版本的文档存在,为了能够让浏览器清楚你的文档的版本类型和风格,需要在文档的起始用DOCTYPE声明制定当前文档的版本和风格.如果在网页中提供了版本信息, ...

  2. Binary Tree Postorder Traversal

    Given a binary tree, return the postorder traversal of its nodes' values. For example:Given binary t ...

  3. 《C标准库》——之<string.h>

    <string.h>里的字符串操作函数是经常要用到的,因此阅读了源码后自己实现了一些: 拷贝函数 void * Mymemcpy(void * sDst, const void * sSr ...

  4. pthread_create 内存释放

    run() { pthread_attr_destroy(&m_attr);    pthread_detach(pthread_self()); }

  5. 每天一个命令ls 2015/4/1

    ls命令可以说是Linux下最常用的命令 -a 列出目录下的所有文件,包括以 . 开头的隐含文件.-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出.-c 输出文件的 i ...

  6. SpaceSniffer 硬盘透视软件

    SpaceSniffer是一个可以让您硬盘中文件和文件夹的分布情况的应用程序. 可以用来查找一些不易发现的文件,因为它提供一些特殊的搜索方式,特别是对于清理磁盘,找出占磁盘空间较大文件的位置很有帮助.

  7. Matlab语法

    第一节 基本数值计算1. 变量:分为数值变量和字符变量 2. 常量:计算机中不变的量.如i.j.pi.NaN(不确定).Inf(无穷大) 3. 字符变量:将字符串作为变量.有三种方法表示:    (1 ...

  8. LINQ 联查多表数据并封装到ViewModel的实现

    LINQ 联查多表数据并封装到ViewModel的实现 public List<MyTask> GetPagedTaskList(int pageIndex, int pageSize, ...

  9. EF 未应用自动迁移,因为自动迁移会导致数据丢失的解决办法

      在  工具->库程序包管理器->程序包管理器控制台   窗口里运行 Add-Migration Initial 指令再输入Update-Database执行

  10. VS2010 中 Entity Framework 多数据库并存方法

    选中相应数据库生成的 *.edmx文件,然后在属性中找到“自定义工具命名空间”,为每个EF数据集设置不同的命名空间,这样每个数据库生成的代码就会被隔离在不同的命名空间,即使同名类型也就不会相互影响了.