libpq-PostgreSQL客户端编程接口(三)----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目录中,有完整的源代码。

你可能感兴趣的:(PostgreSQL)