Qt und SQL - Abfrage Problem



  • Hallo Forum,

    ich brauche mal bitte eure Hilfe, im moment fühl ich mich als seh ich den Wald vor Bäumen nicht.

    In meinen Programm gibts 2 LineEdits, user und passwort. Nach Klick auf Login werden die Daten mit Daten aus der DB abgeglichen ... soweit so gut ....
    Nun will ich dem User aber ein Dialog zeigen, wenn der Nutzername nicht stimmt ... dazu folgender Code:

    void MainWindow::on_personalLoginButton_clicked()
    {
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("gm.db");
        db.open();
    
        QSqlQuery query;
        QString uname = ui->loginusername->text();
        QString pw = ui->loginpassword->text();
    
        query.prepare("SELECT pass FROM users WHERE uname = :name");
        query.bindValue(":name", uname);
        query.exec();
    
        QSqlRecord record = query.record();
    
        while (query.next()) {
    
            QString password = query.value(record.indexOf("pass")).toString();
            if (password == NULL) {
                QMessageBox msg;
                QString text("Benutzername falsch!!");            
                msg.setText(text);
                msg.exec();
                db.close();
            }
            else {
                if (password == ui->loginpassword->text()) {
                    ui->menuQuickmen->setEnabled(true);
                    ui->stackedWidget->setCurrentIndex(1);
                    db.close();
                }
                else {
                    QMessageBox msg;
                    QString text("Passwort falsch!");
                    msg.setText(text);
                    msg.exec();
                    db.close();
                }
            }
        }
    db.close();
    }
    

    Wenn der Nutzername Stimmt, wird der "else"-teil Schleife auch durchlaufen, stimmt aber der Nutzername nicht, wird der "if"-teil nicht durchlaufen, nichtmal die while-schleife .....

    Also hab ich versucht vor die While-Schleife schon eine IF-Else Schleife zu setzen wenn das RecordSet leer ist .... aber .isEmpty und .isNull haben keinen Erfolg gehabt. Ein Count hat auch nicht geholfen .... kann mir mal bitte wer auf die sprünge helfen ?

    Danke
    der Nala


  • Mod

    query.next() kann ja nur funktionieren, wenn es ein ergebnis gibt.
    Übrigens bringt dir der QString == NULL Vergleich nicht wirklich was, nutze hier lieber isEmpty oder empty.



  • Ich hatte ja schon ein Variante mit if-schleife wo ich record.isEmpty() versucht habe, das hat aber auch nicht wirklich funktioniert .... daher stammt ja meine verwirrung .....



  • record.isEmpty() macht aber was anderes. Du suchst query.size() (bitte dazu auch erst Doku lesen).



  • or -1 if the size cannot be determined or if the database does not support reporting information about query sizes

    Kann es sein das SQLITE 3 .size() nicht unterstützt ? In meinem Test ergab sowohl eine korrekte als auch eine falsche query -1.

    Ich hab mir nun damit geholfen das ich aus der while(query.next()) eine if(query.next()) gemacht habe, das funktioniert zumindest für diese Abfrage genau so wie ich es haben will.

    Eine letzte frage dazu noch, ich benutze folgenden Code

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
        db.setDatabaseName("gm.db");
        db.open();
    

    Wenn eine Eingabe falsch ist und man einen 2. versuch macht, ist folgendes zu lesen:

    QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

    Wie kann ich das sinnvoll umgehen ?



  • nalamar schrieb:

    Wenn eine Eingabe falsch ist und man einen 2. versuch macht, ist folgendes zu lesen:

    QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

    Wie kann ich das sinnvoll umgehen ?

    Doku zu QSqlDatabase::addDatabase lesen.

    //edit:
    Und lies dir bitte auch mal durch was zu QSqlQuery::next() steht. Willst du diesen Effekt wirklich?!?


Anmelden zum Antworten