解决 QMYSQL driver not loaded。

发布于:2025-08-29 ⋅ 阅读:(19) ⋅ 点赞:(0)

环境:Qt 5.7 + Win10 

一句话解决

  • 匹配位数libmysql.dll 放到 应用程序的 .exe 同目录(和 myapp.exe 放一起)。

  • 确保 plugins/sqldrivers/qsqlmysql.dll 已随程序部署(用 windeployqt 后再补拷即可)。


完整步骤(推荐做法)

  1. 生成发布包

    • 在 MSVC 环境下编译 Release 版。

    • 运行:

      windeployqt path\to\your\myapp.exe
      
    • 这会把 Qt 运行时、插件目录(含 plugins\sqldrivers)等拷到可执行目录旁。

  2. 拷贝 libmysql.dll.exe 同目录

    • 来源优先级:

      • MySQL Connector/C 对应版本(建议稳定),或

      • 已安装的 MySQL Serverlibmysql.dll

    • 位数必须匹配

      • 你的程序 x64 → 用 64 位 libmysql.dll

      • 你的程序 x86 → 用 32 位 libmysql.dll

    • 版本建议:Qt 5.7 通常与 MySQL 5.7/8.0 的 libmysql.dll 兼容性较好(以你实际编译器为准)。

  3. 确认 qsqlmysql.dll 存在

    • 路径一般为:<app_dir>\plugins\sqldrivers\qsqlmysql.dll

    • 若没有:用 windeployqt 后从你本机 Qt 安装目录复制:

      <Qt>\5.7\<msvc>\plugins\sqldrivers\qsqlmysql.dll
      
  4. 运行测试

    • 启动 myapp.exe,不再出现:

      QSqlDatabase: QMYSQL driver not loaded
      
    • 如仍失败,用 Dependency WalkerDependencies 工具打开:

      • qsqlmysql.dlllibmysql.dll
        确认没有缺失的运行库(如 MSVCRxxx.dll)。


常见坑&速查

  • 位数不匹配

    • 症状:依旧 not loaded 或程序启动即崩。

    • 解决:保证 Qt 架构qsqlmysql.dlllibmysql.dll你的 .exe 全部同为 x86 或 x64

  • MSVC 运行库缺失

    • Qt 5.7 常用 MSVC2015(VC14)工具链。

    • 若目标机没装 VC 运行库:安装 Visual C++ 2015-2019 Redistributable(x86/x64 对应)。

  • libmysql.dll 丢进 System32(不推荐)

    • 容易与其他程序冲突。最好就放 .exe 同目录,优先级最高且最安全。

  • 重复创建连接导致:duplicate connection name / still in use

    • 在代码里避免重复 addDatabase 同名连接。

    • 用完关闭并移除:

      {
          QSqlDatabase db = QSqlDatabase::database("IndexThermoMySQL");
          // ... 使用 db
      } // 先让所有 QSqlQuery/db 局部对象析构
      QSqlDatabase::removeDatabase("IndexThermoMySQL");
      

最小连接示例(含连接复用与关闭)

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

static const char* kConn = "IndexThermoMySQL";

bool openMySqlOnce() {
    QSqlDatabase db;
    if (QSqlDatabase::contains(kConn)) {
        db = QSqlDatabase::database(kConn);
    } else {
        db = QSqlDatabase::addDatabase("QMYSQL", kConn);
        db.setHostName("127.0.0.1");
        db.setPort(3306);
        db.setDatabaseName("testdb");
        db.setUserName("root");
        db.setPassword("password");
    }

    if (!db.isOpen() && !db.open()) {
        qWarning() << "Open MySQL failed:" << db.lastError().text();
        return false;
    }
    return true;
}

void closeMySql() {
    // 确保所有 QSqlQuery、QSqlTableModel 等已析构
    if (QSqlDatabase::contains(kConn)) {
        QSqlDatabase db = QSqlDatabase::database(kConn);
        if (db.isOpen()) db.close();
        QSqlDatabase::removeDatabase(kConn);
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到