Потерял соединение с базой данных при использовании коммутатора statment - PullRequest
0 голосов
/ 13 мая 2011

У меня есть stackedwidget с несколькими страницами, на первой странице я проверяю соединение, на второй странице я проверяю доступность пользователя и так далее для остальной части страницы (у меня пять), в основном, другие страницы зависят на первой странице, если соединение не удалось или нет, моя проблема связана с другими страницами, даже если соединение установлено без каких-либо ошибок, вторая страница не может выполнить свой запрос, я получаю эту ошибку:

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

1 Ответ

0 голосов
/ 23 мая 2011

Из документации:

Предупреждение. Необходимо загрузить драйвер SQL и открыть соединение перед созданием QSqlQuery.Кроме того, соединение должно оставаться открытым, пока существует запрос;в противном случае поведение QSqlQuery не определено.

Так что я должен объявлять переменную QSqlQuery query в каждом case описании, теперь моя проблема решена.

...