最近有兄弟让我帮他写个简单的程序,需要调用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