记录一次 QSqlite driver not loaded 错误
在调试软件的时候,发现查询sqlite数据出了问题,查询不到数据。通过QSqlQuery::latsError
获取错误消息,结果错误原因是 driver not loaded
,但是代码中使用 QSqlDatabase::drivers()
确认了一下是存在QSQLITE
的,而且程序运行的时候,也输出了可用drivers里面是包括 QSQLITE
的。
测试代码
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>
int main(int c,char** v)
{
QCoreApplication app(c,v);
QCoreApplication::addLibraryPath(QCoreApplication::applicationDirPath()+"/sqldrivers");
qDebug() << QSqlDatabase::drivers();
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("D:/work/test.db");
if(!db.open()) {
qDebug() << "Open Error =>" << db.lastError();
return 0;
}
QString sql = "SELECT height, volume, \
FROM st WHERE id=?";
QSqlQuery query(db);
query.prepare(sql);
query.setForwardOnly(true);
query.bindValue(0,2);
query.exec();
if(query.next()) {
qDebug() << query.value("height");
}else {
qDebug() << "query error => "<< query.lastError();
}
}
加载错误时候输出
如下图,是调用时候的输出
这里open
调用是失败的,通过设置了QT_DEBUG_PLUGINS
,可以显示了插件加载的过程。
因为我只把qsqlite.dll
拷贝到了程序目录下的sqldrivers
目录,所以QSqlDatabase::drivers()
的返回只有QSQLITE
一个。
可以通过输出,看出来前面确实是有QSQLITE
的,而且open
的时候,提升是存在QSQLITE drivers
的,但是也提示了是无法正常加载qsqlite.dll
时候的。
问题的原因
通过上面输出cannot load library ...\qsqlite.dll 不是有效的 Win32 应用程序
,这个提示很关键,查看一下我拷贝的qsqlite.dll
文件信息,结果这是一个32位的,而我的程序是编译的64位版本。
这个原因可能是因为某次出错把Qt安装目录下的QtCreator\bin\plugins\sqldrivers\qsqlite.dll
给拷贝到了Qt的目录下,错误的替换掉了原本的64位版本,而QtCreator
是32位的。
如上图所示,替换掉就可以正常输出了。