查看完整版本: [-- Qt5.12.6 数据库跨线程访问失败 --]

QTCN开发网 -> Qt基础编程 -> Qt5.12.6 数据库跨线程访问失败 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

yyzq 2020-06-09 09:36

Qt5.12.6 数据库跨线程访问失败

问题描述:
原先的代码使用Qt5.4 msvc编译32位程序,数据库的初始化放在线程 访问是在其他线程 正常没有问题
同样的代码升级到Qt5.12.6编译64位,初始化可以成功 访问失败 提示drive not loaded
代码如下:
  1. 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;
    }

  1. 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;
    }

  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;
    }



75233109 2020-06-09 18:55
不是版本问题,
Qt的数据库本来就不支持跨线程访问

yyzq 2020-06-10 09:18
75233109:不是版本问题,
Qt的数据库本来就不支持跨线程访问 (2020-06-09 18:55) 

谢谢,是的 在使用的线程open就可以了


查看完整版本: [-- Qt5.12.6 数据库跨线程访问失败 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled