惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
G
Google Developers Blog
L
LangChain Blog
Y
Y Combinator Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
V
Visual Studio Blog
小众软件
小众软件
月光博客
月光博客
A
About on SuperTechFans
H
Hackread – Cybersecurity News, Data Breaches, AI and More
T
The Blog of Author Tim Ferriss
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
阮一峰的网络日志
阮一峰的网络日志
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
MongoDB | Blog
MongoDB | Blog
Jina AI
Jina AI
美团技术团队
量子位

博客园 - ode

[原创]pg_shard使用场景及功能测试 [原创]PostgreSQL中十进制、二进制、十六进制之间的相互转换 [原创]在Windows和Linux中搭建PostgreSQL源码调试环境 [原创]Postgres-XC集群笔记-概念与环境搭建 [翻译]开源PostgreSQL监控工具OPM [原创]使用benchmarksql和pgbench对PostgreSQL Plus Advanced Server进行性能测试 [原创]PostgreSQL Plus Advanced Server监控工具PEM(四) [原创]PostgreSQL Plus Advanced Server监控工具PEM(三) [原创]PostgreSQL Plus Advanced Server监控工具PEM(二) [原创]PostgreSQL Plus Advanced Server监控工具PEM(一) [原创]EnterpriseDB测试key申请方法 [原创] PostgreSQL Plus Advanced Server在Windows中配置双机热备流复制 [原创]PostgreSQL Plus Advanced Server批量创建分区表写入亿级别数据实例 [原创]从Oracle和Microsoft Sql Server迁移到PostgreSQL Plus Advanced Server [原创]PostgreSQL Plus Advince Server在 HA环境中一对多的Stream Replication配置(四) [原创]PostgreSQL Plus Advince Server在 HA环境中一对多的Stream Replication配置(三) [原创]PostgreSQL Plus Advince Server在 HA环境中一对多的Stream Replication配置(二) [原创]PostgreSQL Plus Advince Server在 HA环境中一对多的Stream Replication配置(一) [原创]PostgreSQL Plus Advanced Server配合crontab实现定时维护工作
[原创]libpq-PostgreSQL客户端编程接口(三)----libpq在Qt中...
ode · 2013-05-16 · via 博客园 - ode

本文分两部分,第一部分介绍了在Qt for c++库中通过Qt的psql驱动对EnterpriseDB进行访问;第二部分简单介绍Qt对libpq的封装,如有兴趣自己封装libpq库,可以作为参考。

实验环境:
操作系统:windows 7
Qt:4.7.4
编译器:GNU make 3.81
数据库:EnterpriseDB(PostgreSQL Plus Advanced Server 9.2)

一、Qt开发PostgreSQL Plus Advanced Server客户端应用
1、安装 EnterpriseDB ( http://www.postgresql.org/ )
2、编译Qt的psql驱动
a、在环境变量中增加(这一步我现在想想好像并没用): D:\edb\9.2AS\include;D:\edb\9.2AS\lib
b、在Qt的目录中:Qt\4.8.0\src\plugins\sqldrivers\psql 执行: qmake "INCLUDEPATH+=D:/edb/9.2AS/include" "LIBS+=D:/edb/9.2AS/lib/libpq.lib" psql.pro 如果已经将PostgreSQL安装到路径中带有空格的目录,那很遗憾,只能卸载了重新安装,Qt对路径中的空格处理有问题。
3、将D:\edb\9.2AS\bin目录中的dll文件copy到执行文件的目录
4、连接postgresql数据库
下面给出一段简单的代码示例

    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL","MYPSQLDBCONN");
    db.setHostName("localhost");
    db.setDatabaseName("testdb");
    db.setUserName("postgres");
    db.setPassword("ode");
    db.setPort(5432);

    if(db.open())
    {
        // QSqlTableModel 作为数据源
        sqlModel = new QSqlTableModel(this,db);
        sqlModel->setTable("testtable");
        sqlModel->setEditStrategy(QSqlTableModel::OnFieldChange);
        sqlModel->select();

     // http://ode.cnblogs.com 
     // http://odevincent.blog.51cto.com 
        tableView->setModel(sqlModel);
        tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
        tableView->setAlternatingRowColors(true);
        tableView->setGridStyle(Qt::DashLine);
        tableView->show();
    }
    else
    {
        QMessageBox::critical(this,"error",db.lastError().text());
    }

需要注意的是:如果使用一个QSqlTableModel,设置数据表直接输出,编辑项之后,排序可能会发生变化,解决这个问题可以显式的指定一个排序列: sqlModel->setSort(0,Qt::DescendingOrder); 这样,就指定了第一列(索引为0)降序排列。

第二部分:Qt中对libpq的封装
这部分内容很多,与Qt库相关的知识点均跳过,这里以 PQresultStatus 对象为例,了解Qt中对libpq的几个重要对象是如何封装的。

bool QPSQLResultPrivate::processResults()
{
    if (!result)
        return false;

    int status = PQresultStatus(result);
    if (status == PGRES_TUPLES_OK) {
        q->setSelect(true);
        q->setActive(true);
        currentSize = PQntuples(result);
        return true;
    } else if (status == PGRES_COMMAND_OK) {
        q->setSelect(false);
        q->setActive(true);
        currentSize = -1;
        return true;
    }
    q->setLastError(qMakeError(QCoreApplication::translate("QPSQLResult",
                    "Unable to create query"), QSqlError::StatementError, driver, result));
    return false;
}

在Qt的/Src/qtbase/src/sql/drivers/psql目录中,有完整的源代码。