Qt5连接PostgreSQL10(Windows版)(二)

前情回顾

上回说到,我们创建了项目HelloPg,添加了includelib路径,使用头文件libpq-fe.hPGconn类创建了一个对象。
那么接下来如何连接指定的PostgreSQL数据库获取数据呢?这里使用PostgreSQL的官方例程做参考

一、 寻找例程

在安装PostgreSQL过程中,是附带了说明文档的,但是是英文的
Qt5连接PostgreSQL10(Windows版)(二)_第1张图片
PostgreSQL官网提供了中文文档:文档目录
找到第10版:PostgreSQL 10.1 手册
IV. 客户端接口->33. libpq - C 库找到:33.21. 例子程序
代码如下:

/*
 * testlibpq.c
 *
 *      测试libpq的C版本,PostgreSQL前端库。
 */
#include 
#include 
#include 

static void
exit_nicely(PGconn *conn)
{
    PQfinish(conn);
    exit(1);
}

int
main(int argc, char **argv)
{
    const char *conninfo;
    PGconn     *conn;
    PGresult   *res;
    int         nFields;
    int         i,
                j;

    /*
     * 如果用户在命令行上提供了一个参数,则拿它当作 conninfo 字串使用;
     * 否则缺省为 dbname=postgres 并且使用环境变量或者所有其它连接参数
     * 都使用缺省值。
     */
    if (argc > 1)
        conninfo = argv[1];
    else
        conninfo = "dbname = postgres";

    /* 连接数据库 */
    conn = PQconnectdb(conninfo);

    /* 检查后端连接成功建立 */
    if (PQstatus(conn) != CONNECTION_OK)
    {
        fprintf(stderr, "Connection to database failed: %s",
                PQerrorMessage(conn));
        exit_nicely(conn);
    }

    /*
     * 我们的测试实例涉及游标的使用,这个时候我们必须使用事务块。
     * 我们可以把全部事情放在一个  "select * from pg_database"
     * PQexec() 里,不过那样太简单了,不是个好例子。
     */

    /* 开始一个事务块 */
    res = PQexec(conn, "BEGIN");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "BEGIN command failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }

    /*
     * 应该在结果不需要的时候 PQclear PGresult,以避免内存泄漏
     */
    PQclear(res);

    /*
     * 从系统表 pg_database(数据库的系统目录)里抓取数据
     */
    res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");
    if (PQresultStatus(res) != PGRES_COMMAND_OK)
    {
        fprintf(stderr, "DECLARE CURSOR failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }
    PQclear(res);

    res = PQexec(conn, "FETCH ALL in myportal");
    if (PQresultStatus(res) != PGRES_TUPLES_OK)
    {
        fprintf(stderr, "FETCH ALL failed: %s", PQerrorMessage(conn));
        PQclear(res);
        exit_nicely(conn);
    }

    /* 首先,打印属性名称 */
    nFields = PQnfields(res);
    for (i = 0; i < nFields; i++)
        printf("%-15s", PQfname(res, i));
    printf("\n\n");

    /* 然后打印行 */
    for (i = 0; i < PQntuples(res); i++)
    {
        for (j = 0; j < nFields; j++)
            printf("%-15s", PQgetvalue(res, i, j));
        printf("\n");
    }

    PQclear(res);

    /* 关闭入口 ... 我们不用检查错误 ... */
    res = PQexec(conn, "CLOSE myportal");
    PQclear(res);

    /* 结束事务 */
    res = PQexec(conn, "END");
    PQclear(res);

    /* 关闭数据库连接并清理 */
    PQfinish(conn);

    return 0;
}

挺长的,但实际上就是两个函数exit_nicelymain

二、 修改例程

将该例程中开头的文件注释和包含头文件include舍去,只留下两个函数的定义,复制粘贴到mainwindow.cpp
Qt5连接PostgreSQL10(Windows版)(二)_第2张图片
复制粘贴过来之后要做如下几件事:

1. 修改函数名称

main改为test

2. 添加函数声明

在包含头文件的几个include后面,声明函数

int test(int argc, char **argv);

3. 调用函数

MainWindow的构造函数中调用

test(0,0);

4. 修改连接信息

test函数中,找到为conninfo赋值的这句话,在字符串中添加如下内容,记得用空格与前面的内容隔开:

 user=postgres password=123456

Qt5连接PostgreSQL10(Windows版)(二)_第3张图片
注意,这里的user=postgres是一定存在的,安装时就会创建该用户,而且是个大佬superuser
password=123456是安装过程自己填写的,所以请自行回忆。
Qt5连接PostgreSQL10(Windows版)(二)_第4张图片

三、 测试运行

1. 环境变量

代码修改完毕。再次运行,失败,应用程序输出为程序异常结束
wrong
直接运行失败,那么只构建试试看。点击左下角锤子构建,并没有错。至此,Qt方面配置完成。


那么出问题的就是PostgreSQL了。
此时添加环境变量,确保运行时能找到PostgreSQL。

开始菜单输入环境变量或右键我的电脑属性->高级系统设置,点击环境变量
Qt5连接PostgreSQL10(Windows版)(二)_第5张图片
Qt5连接PostgreSQL10(Windows版)(二)_第6张图片
Qt5连接PostgreSQL10(Windows版)(二)_第7张图片
Qt5连接PostgreSQL10(Windows版)(二)_第8张图片
选中系统变量中的Path,点击编辑
Qt5连接PostgreSQL10(Windows版)(二)_第9张图片
新建一条环境变量,通过浏览找到PostgreSQL安装文件夹下的bin,将其添加为新的环境变量
Qt5连接PostgreSQL10(Windows版)(二)_第10张图片
环境变量添加后,直接回到项目中,再次运行,失败,同样的错误。

关闭QtCretor,再重新启动QtCretor,打开项目,再次运行,成功
success

2. 结果分析

再次构建、运行,照常弹出窗口,关闭。注意到下方3 应用程序输出闪烁,打开查看
Qt5连接PostgreSQL10(Windows版)(二)_第11张图片
该现象说明,该程序调用修改了的test函数,从PostgreSQL数据库中获取了数据表的内容,并输出在这里,我们可以详细查看代码和pgAdmin,找到这些数据的来源

代码中,中文注释详细解释了该例程做的事情,即从系统表 pg_database(数据库的系统目录)里抓取数据,再打印出来
Qt5连接PostgreSQL10(Windows版)(二)_第12张图片
从pgAdmin中可以看到,在连接信息conninfo中写到的dbname=postgres,就是该例程所连接的数据库名称。找到该数据库下的数据表pg_database,可以右键查看所有行的数据,将这些数据与程序运行输出对比,从结果上验证了此例程的作用。
Qt5连接PostgreSQL10(Windows版)(二)_第13张图片

参考文献

[1] Qt5连接PostgreSQL10(Windows版)(一)
[2] 33.21. 例子程序

你可能感兴趣的:(Qt5连接PostgreSQL10(Windows版)(二))