天天看点

QT 调用Access数据库 (QT ODBC Driver)

最近有兄弟让我帮他写个简单的程序,需要调用MS Office 中的Access数据库文件进行操作,希望我用VC写。因为习惯了QT的简单明了,同样的windows平台程序,就选择用QT帮他写了。

    以前项目中使用过Sqlite进行数据库操作,基本的流程大致清楚,但是这次需要调用Access,自然需要用到其他的数据库Driver,也就是QT通过ODBC来连接SQLServer。

    首先需要确认自己安装QT是否带有所需要的DB Driver。

    通常安装QT会默认安装Sqlite的Driver,我们可以用以下代码进行测试

    QSqlDatabase m_db = QSqlDatabase::addDatabase("QSQLITE");

m_db.setDatabaseName("test.db");

if ( !m_db.open())

{

qDebug()<<"DB open error!";

}

else

{

qDebug()<<"DB open Sucess!";

}

而测试ODBC连接则不能简单的仿照,setDatabaseName不是简单的输入数据库名,而是DNS名。可以采用DSN连接字符串直接连接ODBC数据库,也可直接设置DNS(没有用过)。

简单来说, 数据库名应该这样写  "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"

QSqlDatabase m_db = QSqlDatabase::addDatabase("QODBC");

m_db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ=db.mdb;UID=;PWD=");

bool ok = m_db.open();

if(ok)

{

QDebug()<<"数据库打开成功";

}

else

{

QDebug()<<数据库打开失败";

}

有一种更简单的测试方法如下

int main(int argc, char* argv[]) {

QApplication app(argc, argv);

qDebug() << "Available drivers:";

QStringList drivers = QSqlDatabase::drivers();

foreach(QString driver, drivers)

qDebug() << "/t" << driver;

QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

qDebug() << "ODBC driver valid?" << db.isValid();

}

如果输出中有

Available drivers:

"QSQLITE"

"QODBC4"

"QODBC"

ODBC driver valid? true

就说明已经可以成功支持ODBC了。

如果你在安装QT时什么也没有配置,通常只会有QSQLITE出现。这样就需要安装QODBC4。

编译ODBC插件。可以通过 configure -plugin-sql-odbc来保证,也可以单独编译~/src/plugins/sqldrivers/odbc

qmake -t vclib odbc.pro

qmake

nmake

编译后,在~/plugins/sqldrivers/下应该有qsqlodbcd4.dll(debug)或qsqlodbc4.dll

这个方法是以前没有注意到的,也就是在编译QT源码时如果有些插件或功能没有编译进去,可以单独通过上述方法编译,非常灵敏,以前都没有注意到。

通过上述步骤就拥有了ODBC的QT driver了

于是就可以写程序了。

在QSqlDatabase设置完后,再通过

QSqlQuery *m_pQuery = new QSqlQuery(m_db);

m_pQuery->exec("select * FROM Table1“) 这些常规sql语句就可以进行操作了

程序写完后,需要将相应的库文件放在一起。除了常规的QtCore4.dll QtGui4.dll QtSql4.dll , 因为在windows下开发的Qt,还要把mingwm10.dll 加上。 最开始我直接将qsqlodbc4.dll 放在程序同级目录下,发现无法打开数据库文件了。最后发现需要建一个sqldrivers文件夹放在同级目录,然后把qsqlodbc4.dll放进去就可以了。

其他相关可知识参考

http://v.tampacrave.com/html/sejishikongxiangguanwenzhang/20090429/122.html

http://www.cnblogs.com/buffer/archive/2009/05/25/1488613.html