使用 switch 语句时丢失了与数据库的连接

Lost the connection to database when using switch statment

本文关键字:数据库 连接 switch 语句 使用      更新时间:2023-10-16

>我stackedwidget了多个页面,在第 1 页,我检查连接,第 2 页,我检查用户的可用性,依此类推页面的其余部分(我有五个),基本上,其他页面依赖于第一页,如果连接失败与否,我的问题是关于其他页面,甚至是没有任何错误的连接, 第二页无法进行查询,我收到此错误:

QSqlQuery::prepare: database not open

我的插槽:

void ConfSetup::setNextPage()
{
    int currentIndex = ui->stackedWidget->currentIndex();
    switch(currentIndex)
     {
       case 1:
        ui->stackedWidget->setCurrentIndex(currentIndex + 1);
       break;
       case 2:
        db = QSqlDatabase::addDatabase("QMYSQL");
        db.setDatabaseName("mysql");
        db.setHostName(ui->serverEdit->text());
        db.setPort(ui->portEdit->text().toInt());
        db.setUserName(ui->userEdit->text());
        db.setPassword(ui->passwordEdit->text());
        if(!db.open())
         {
           QMessageBox::critical(0, trUtf8("Fail to login"), trUtf8("Wrong user or password"));
         }
        else
          ui->stackedWidget->setCurrentIndex(currentIndex + 1);
       break;
       case 3:
        query.prepare("SELECT user FROM user WHERE user=:user");
        query.bindValue(":user", ui->userDbEdit->text());
        query.exec();
        if(query.numRowsAffected() == 1)
           QMessageBox::critical(0, trUtf8("User exist"), trUtf8("This user already token"));
        else
           ui->stackedWidget->setCurrentIndex(currentIndex + 1);
       break;
       case 4:
        query.prepare("SELECT SCHEMA_NAME AS 'Database' FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME=:database");
        query.bindValue(":database", ui->dbNameEdit->text());
        query.exec();
        if(query.numRowsAffected() == 1)
           QMessageBox::critical(0, trUtf8("Fail to create database"), trUtf8("This database already exist"));
        else
           ui->stackedWidget->setCurrentIndex(currentIndex + 1);
       break;
     }
}

连接:

connect(ui->nextButton0, SIGNAL(clicked()), this, SLOT(setNextPage()));
connect(ui->nextButton1, SIGNAL(clicked()), this, SLOT(setNextPage()));
//etc

从文档中:

警告:您必须加载 SQL 驱动程序 并在 创建 QSqlQuery。此外, 连接必须保持打开状态,而 查询存在;否则,行为 的 QSqlQuery 未定义。

所以我必须在每个case语句中声明QSqlQuery query变量,现在我的问题解决了。