今天打包Qt程序后,运行exe,报了一个奇葩的错误:Driver not loaded
乍看之下,是数据库驱动没有加载,但我在程序调试中,Debug和Release都没问题,在网上找了一圈答案后,也没有解决我的问题。网上的答案无非两种:1、代码写的有问题;2、打包的文件夹中没有qsqlite.dll等文件,这里就不详述。
折腾了半天,才发现了问题的所在:
1、我的程序中,数据库文件是代码自动创建的,代码大致如下:
QSqlDatabase sqlDB;
sqlDB = QSqlDatabase::addDatabase("QSQLITE");
sqlDB.setDatabaseName("DbFileName.db"); // 你的数据库文件名称
//sqlDB.setUserName("Admin");
//sqlDB.setPassword("123");
//sqlDB.setPort(6002);
if (sqlDB.open()) {
// do something
} else {
// log 数据库打开失败
}
在代码中启动时,使用QSqlDatabase的open函数,可以创建数据库文件,甚至可以创建文件夹,等同于QDir和QFile的功能,但是打包后,该方法就行不通了,只好通过QFile方法创建数据库文件;
2、我封装的数据库类使用的是单例模式,上述代码也是写在构造函数中,也不知何原因,在数据库文件已存在的情形下,运行打包的exe文件还是报错,但我写的一个Demo程序就不会报错,难道是不能在单例模式的构造函数中打开数据库文件?
于是我变换思路,将打开数据库文件的操作封装在一个函数中,在main函数中执行该函数,好家伙,这样就可以正确打开和读取数据库文件了。
总结:Qt的水太深,稍不留意就把握不住