• [原创]libpqPostgreSQL客户端编程接口(三)libpq在Qt中的封装实现及应用


    本文分两部分,第一部分介绍了在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目录中,有完整的源代码。

  • 相关阅读:
    Leaf-spine data center architectures
    centreon 画图x轴乱码
    二分图匹配
    牛客练习赛17
    HDU-4550-贪心
    HDU-4511-ac自动机+dp
    UVA-11761-马尔可夫/记忆化搜索
    HDU-3853-期望/dp/坑
    HDU-4405-期望dp
    zoj-3329-期望/dp/方程优化
  • 原文地址:https://www.cnblogs.com/ode/p/3081591.html
Copyright © 2020-2023  润新知