Warum brauch ich für bindValue auf einmal QVariant?



  • Ich hab das schon in ein oder zwei Projekten ohne Probleme verwendet, aber nun hing ich eine Weile an einem ganz simplen Problem fest. Und ich verstehe meine Lösung dazu nicht.

    Es könnte sein, dass ich vorher Qt 5.6 verwendet habe und nun QT 5.7. Hab das jetzt nicht genauer nachgelesen.

    Auf jedenfall gehts um das hier

    bool Database::login(const QString& token)
    {
        QSqlQuery query(this->_db);
    
        query.prepare("SELECT id FROM tblUser WHERE token = :token");
        query.bindValue(":token", token);
    
        if (query.exec())
        {
            if (query.first())
                return true;
        }
        return false;
    }
    

    In anderen Projekten war das nie ein Problem gewesen. Hab da auch immer mit der QtGui programmiert und das jetzige Projekt ist eine Konsolenanwendung.

    Das Problem selber war, dass er bei diesem simplen Code immer den Fehler geworfen hat "no matching function find for bindValue". Das hat mich natürlich zum rätseln gebracht und hab mal genauer nachgelesen. Als 2. Parameter wird immer ein QVariant erwartet. Normal kann man doch einfach einen QString übergeben oder nicht?

    Auf jedenfall musste ich für nur diese Function (bindValue) das QVariant includen. Obwohl ich nirgends ein QVariant verwende.

    Ist das normal? Hab ich noch nie irgendwo gehabt.



  • Vermutlich wurde QVariant in den headern, wo QSqlQuery declariert wird QVariant nur per forward declaration angegeben.
    Dadurch kann aber der Compiler nicht wissen das ein QVariant aus einem QString erstellt werden kann.
    Deshalb musst du dann QVariant direkt includieren.

    Da es in deinen anderen Projekten funktioniert, könnte auch daran liegen, dass du dort einen zusätzliche Header includiert hast, welcher eventuell selbst den Header von QVariant includiert



  • firefly schrieb:

    Vermutlich wurde QVariant in den headern, wo QSqlQuery declariert wird QVariant nur per forward declaration angegeben.
    Dadurch kann aber der Compiler nicht wissen das ein QVariant aus einem QString erstellt werden kann.
    Deshalb musst du dann QVariant direkt includieren.

    Da es in deinen anderen Projekten funktioniert, könnte auch daran liegen, dass du dort einen zusätzliche Header includiert hast, welcher eventuell selbst den Header von QVariant includiert

    Das könnte eventuell sein. Da ich ja auch bei den anderen Projekten die GUI verwendet habe. Da wurde wahrscheinlich irgendwo QVariant inkludiert. Jetzt bei dem Konsoleprojekt muss ich vieles noch zusätzlich inkludieren. Ist mir auch bei ähnlichen Fällen vorgekommen. Dort hatte ich aber die Klasse selber verwendet.



  • Schau dir mal den Header QtCore an, dort werden viele Header inkludiert die oft benötigt werden. Unter anderem auch QVariant.


Log in to reply