记录一次 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位的。

如上图所示,替换掉就可以正常输出了。

参考

posted @ 2023-09-07 11:49  乌合之众  阅读(279)  评论(0编辑  收藏  举报
clear