• 1042阅读
  • 2回复

[提问]sqlite 多线程获取同名的连接,isOpen返回false [复制链接]

上一主题 下一主题
离线介农酥
 

只看楼主 倒序阅读 楼主  发表于: 2024-09-05
回复本帖可获得10RMB金钱奖励!
每人最多可获奖1次,奖池剩余20RMB金钱 (中奖几率90%)
不是说连接名可以跨线程吗,我主线程打开数据的一个物理连接之后,在主线程中isOpen()返回true,辅线程返回false,难道后面的版本(我用的是Qt5.15.2)连接名又不能跨线程了。

主线程:

QString MainWindow::connectionName = "1";
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    {
        QSqlDatabase db;
        if (QSqlDatabase::contains(connectionName))
        {
            db = QSqlDatabase::database(connectionName);
        }
        else
        {
            db = QSqlDatabase::addDatabase("QSQLITE", connectionName);
        }

        QString exepath = QApplication::applicationDirPath();
        db.setDatabaseName(exepath+"/zhu-hai_gao-lan-gang_gree_label.db");
        bool ok = db.open();
        if (!ok) {
            QString errStr = db.lastError().text();
            qDebug()<<errStr;
        }
    }


    QSqlDatabase db = QSqlDatabase::database(connectionName);    if (db.isOpen())
        qDebug() << "数据库打开";    else
        qDebug() << "数据库关闭";}

辅线程:

void MainWindow::on_pushButton_clicked()
{
    QFuture<void> res = QtConcurrent::run([&]()
                                          {
                                              QString connection = MainWindow::connectionName;
                                              QSqlDatabase db1 = QSqlDatabase::database(connection);
                                              if (db1.isOpen())
                                                  qDebug() << "数据库打开";
                                              else
                                                  qDebug() << "数据库关闭";
                                          });
}
不应该是数据库打开吗?
离线spygg

只看该作者 1楼 发表于: 2024-09-06
回帖奖励+ 10
文档里面有说,本来就不能跨线程的啊,参见Threads and the SQL Module
签名就是这么浪
离线介农酥

只看该作者 2楼 发表于: 2024-09-07
回 spygg 的帖子
spygg:文档里面有说,本来就不能跨线程的啊,参见Threads and the SQL Module (2024-09-06 11:50) 

感谢,其实这个模块我是看到的,但是我记得以前说连接名是可以跨线程,只是对象不能。所以提问也说了这点。不过,听你这么说,我就放心了,感谢!
快速回复
限100 字节
 
上一个 下一个