• 1758阅读
  • 2回复

[提问]Qt5.12.6 数据库跨线程访问失败 [复制链接]

上一主题 下一主题
离线yyzq
 

只看楼主 倒序阅读 楼主  发表于: 2020-06-09
问题描述:
原先的代码使用Qt5.4 msvc编译32位程序,数据的初始化放在线程 访问是在其他线程 正常没有问题
同样的代码升级到Qt5.12.6编译64位,初始化可以成功 访问失败 提示drive not loaded
代码如下:
  1. bool BTDatabaseCtl::initDB(const QString &dbName, const QString &password)
  2. {
  3.     [color=#ff0000]//--- 线程中初始化[/color]
  4.     mMutex.lock();
  5.     bool flag = false;
  6.     if (mDriver == nullptr)
  7.     {
  8.         mDriver = new ZSQLiteCipherDriver();
  9.     }
  10.     else
  11.     {
  12.         mMutex.unlock();
  13.         return true;
  14.     }
  15.     mDBName = dbName;
  16.     mPassword = password;
  17.     mConnectionName = BTAppHelper::creatUid();
  18.     QSqlDatabase innerDB = QSqlDatabase::addDatabase(mDriver, mConnectionName);
  19.     switch (openDB(innerDB, dbName, password))
  20.     {
  21.     case -2:
  22.         LOG_ERROR() << "Open database failed." << dbName;
  23.         break;
  24.     case -1:
  25.         LOG_ERROR() << "Create database failed." << dbName;
  26.         break;
  27.     case 0:
  28.         LOG_ERROR() << "Incorrect password/not database file." << dbName;
  29.         break;
  30.     case 1:
  31.         LOG_DEBUG() << "Create database succeeded." << dbName;
  32.         flag = true;
  33.         break;
  34.     case 2:
  35.         LOG_DEBUG() << "Open database succeeded." << dbName;
  36.         flag = true;
  37.         break;
  38.     }
  39.     mMutex.unlock();
  40.     return flag;
  41. }

  1. int BTDatabaseCtl::openDB(QSqlDatabase &db, const QString &dbName, const QString &password)
  2. {
  3.     QFile file(dbName);
  4.     bool isDbFileExists = file.exists() && (file.size() > 0);
  5.     db.setDatabaseName(dbName);
  6.     db.setPassword(password);
  7.     if (!db.open())
  8.     {
  9.         return isDbFileExists ? -2 : -1;
  10.     }
  11.     if (isDbFileExists && !isDbDecrypted(db))
  12.     {
  13.         db.close();
  14.         return 0;
  15.     }
  16.     return isDbFileExists ? 2 : 1;
  17. }

  1. QSqlDatabase BTDatabaseCtl::getEncryptedDB()
  2. {
  3.     mMutex.lock();
  4.     [color=#ff0000]// 数据库连接名是存在的[/color]
  5.     if (QSqlDatabase::contains(mConnectionName))
  6.     {
  7.         [color=#ff0000]// 但是此处获取失败 db.isValid()返回false[/color]
  8.         QSqlDatabase db = QSqlDatabase::database(mConnectionName);
  9.         if (db.isOpen())
  10.         {
  11.             mMutex.unlock();
  12.             return db;
  13.         }
  14.         db.setDatabaseName(mDBName);
  15.         db.setPassword(mPassword);
  16.         if (!db.open())
  17.         {
  18.             LOG_ERROR() << "Open database failed:" << mDBName;
  19.         }
  20.         mMutex.unlock();
  21.         return db;
  22.     }
  23.     QSqlDatabase innerDB = QSqlDatabase::addDatabase(mDriver, mConnectionName);
  24.     innerDB.setDatabaseName(mDBName);
  25.     innerDB.setPassword(mPassword);
  26.     if (!innerDB.open())
  27.     {
  28.         LOG_ERROR() << "Open database failed:" << mDBName;
  29.     }
  30.     mMutex.unlock();
  31.     return innerDB;
  32. }


离线75233109

只看该作者 1楼 发表于: 2020-06-09
不是版本问题,
Qt的数据库本来就不支持跨线程访问
离线yyzq

只看该作者 2楼 发表于: 2020-06-10
回 75233109 的帖子
75233109:不是版本问题,
Qt的数据库本来就不支持跨线程访问 (2020-06-09 18:55) 

谢谢,是的 在使用的线程open就可以了
快速回复
限100 字节
 
上一个 下一个