zoukankan      html  css  js  c++  java
  • vs2010连接postgresql数据库

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

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

    (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/

  • 相关阅读:
    软件工程14—第09组 Beta冲刺(2/4)
    软件工程13—第09组 Beta冲刺(1/4)
    软件工程12—第09组 Alpha事后诸葛
    软件工程11—第09组 Alpha冲刺(4/4)
    软件工程10—第09组 Alpha冲刺(3/4)
    软件工程09—第09组 Alpha冲刺(2/4)
    软件工程08—第09组 Alpha冲刺(1/4)
    软件工程07—第09组 团队Git现场编程实战
    软件工程06—亚瑟王の十三水2.0
    第06组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/infiniti/p/4274752.html
Copyright © 2011-2022 走看看