QSqlquery prepare () и bindvalue () не работают? - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть этот код для управления логинами, вот небольшой кусочек:

void Login::on_pushButton_clicked(){
    QString user, password;
    user = ui->username->text();
    password = ui->pass->text();

    QSqlQuery qry;
    qry.prepare("SELECT id, name from users WHERE username = :username AND password = :password");
    qry.bindValue(":username", user);
    qry.bindValue(":password", password);{
    int counter = 0;
    while (qry.next()){
        counter++;
    }
    if(counter==1)
        ui -> statuslabel -> setText("Sign in successful");
    if(counter<1)
        ui -> statuslabel -> setText("Sign in unsuccessful");
    }
}

При вводе правильного ввода (т. Е. Правильного пароля и имени пользователя) он не работает и переходит ко второму, если условие о том, что вход не выполнен. У меня есть тип счетчика int, который подсчитывает, сколько экземпляров пользовательского ввода соответствуют таблицам базы данных. Он инициализируется нулем, что означает, что это не проблема. Любые идеи о том, что может быть здесь?

1 Ответ

0 голосов
/ 06 ноября 2018

Вы забыли позвонить qry.exec() перед тем, как получить доступ к первому элементу, используя qry.next(). Он должен вызываться после последнего qry.bindValue().

Ниже приведен пример того, как это можно сделать в вашем коде:

QSqlQuery qry;
qry.prepare("SELECT id, name from users WHERE username = :username AND password = :password");
qry.bindValue(":username", user);
qry.bindValue(":password", password);
qry.exec()
if(!qry.isActive())
{
    ui -> statuslabel -> setText("SQL Statement execution failed");
    return;
}
if(qry.size() > 0)
    ui -> statuslabel -> setText("Sign in successful");
else
    ui -> statuslabel -> setText("Sign in unsuccessful");

Примечание. Вам не нужно использовать QSqlQuery::next, чтобы проверить, возвращает ли ваш оператор SELECT какой-либо результат. QSqlQuery::size метод вернет количество выбранных строк.

...