[原创]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目录中,有完整的源代码。

原文地址:https://www.cnblogs.com/ode/p/3081591.html