yyzq |
2020-06-09 09:36 |
Qt5.12.6 数据库跨线程访问失败
问题描述: 原先的代码使用Qt5.4 msvc编译32位程序,数据库的初始化放在线程 访问是在其他线程 正常没有问题 同样的代码升级到Qt5.12.6编译64位,初始化可以成功 访问失败 提示drive not loaded 代码如下:
- bool BTDatabaseCtl::initDB(const QString &dbName, const QString &password)
{ [color=#ff0000]//--- 线程中初始化[/color] mMutex.lock();
bool flag = false; if (mDriver == nullptr) { mDriver = new ZSQLiteCipherDriver(); } else { mMutex.unlock();
return true; }
mDBName = dbName; mPassword = password; mConnectionName = BTAppHelper::creatUid(); QSqlDatabase innerDB = QSqlDatabase::addDatabase(mDriver, mConnectionName);
switch (openDB(innerDB, dbName, password)) { case -2: LOG_ERROR() << "Open database failed." << dbName; break;
case -1: LOG_ERROR() << "Create database failed." << dbName; break;
case 0: LOG_ERROR() << "Incorrect password/not database file." << dbName; break;
case 1: LOG_DEBUG() << "Create database succeeded." << dbName; flag = true; break;
case 2: LOG_DEBUG() << "Open database succeeded." << dbName; flag = true; break; }
mMutex.unlock();
return flag; }
- int BTDatabaseCtl::openDB(QSqlDatabase &db, const QString &dbName, const QString &password)
{ QFile file(dbName); bool isDbFileExists = file.exists() && (file.size() > 0); db.setDatabaseName(dbName); db.setPassword(password);
if (!db.open()) { return isDbFileExists ? -2 : -1; }
if (isDbFileExists && !isDbDecrypted(db)) { db.close(); return 0; }
return isDbFileExists ? 2 : 1; }
- QSqlDatabase BTDatabaseCtl::getEncryptedDB()
{ mMutex.lock();
[color=#ff0000]// 数据库连接名是存在的[/color] if (QSqlDatabase::contains(mConnectionName)) { [color=#ff0000]// 但是此处获取失败 db.isValid()返回false[/color] QSqlDatabase db = QSqlDatabase::database(mConnectionName); if (db.isOpen()) { mMutex.unlock();
return db; }
db.setDatabaseName(mDBName); db.setPassword(mPassword);
if (!db.open()) { LOG_ERROR() << "Open database failed:" << mDBName; }
mMutex.unlock();
return db; }
QSqlDatabase innerDB = QSqlDatabase::addDatabase(mDriver, mConnectionName); innerDB.setDatabaseName(mDBName); innerDB.setPassword(mPassword);
if (!innerDB.open()) { LOG_ERROR() << "Open database failed:" << mDBName; }
mMutex.unlock();
return innerDB; }
|
|