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