环境:Qt 5.7 + Win10
一句话解决
将 匹配位数 的
libmysql.dll
放到 应用程序的.exe
同目录(和myapp.exe
放一起)。确保
plugins/sqldrivers/qsqlmysql.dll
已随程序部署(用windeployqt
后再补拷即可)。
完整步骤(推荐做法)
生成发布包
在 MSVC 环境下编译 Release 版。
运行:
windeployqt path\to\your\myapp.exe
这会把 Qt 运行时、插件目录(含
plugins\sqldrivers
)等拷到可执行目录旁。
拷贝
libmysql.dll
到.exe
同目录来源优先级:
MySQL Connector/C 对应版本(建议稳定),或
已安装的 MySQL Server 的
libmysql.dll
。
位数必须匹配:
你的程序 x64 → 用 64 位
libmysql.dll
你的程序 x86 → 用 32 位
libmysql.dll
版本建议:Qt 5.7 通常与 MySQL 5.7/8.0 的
libmysql.dll
兼容性较好(以你实际编译器为准)。
确认
qsqlmysql.dll
存在路径一般为:
<app_dir>\plugins\sqldrivers\qsqlmysql.dll
若没有:用
windeployqt
后从你本机 Qt 安装目录复制:<Qt>\5.7\<msvc>\plugins\sqldrivers\qsqlmysql.dll
运行测试
启动
myapp.exe
,不再出现:QSqlDatabase: QMYSQL driver not loaded
如仍失败,用 Dependency Walker 或 Dependencies 工具打开:
qsqlmysql.dll
和libmysql.dll
确认没有缺失的运行库(如MSVCRxxx.dll
)。
常见坑&速查
位数不匹配
症状:依旧
not loaded
或程序启动即崩。解决:保证 Qt 架构、
qsqlmysql.dll
、libmysql.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);
}
}
。