Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.3.1 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Win] [Win] Problème connexion SQLite

Bonsoir,
Je dois faire une petite application dans laquelle il faut que je me connecte à une base de données. J'ai crée une base de données avec sqlite et j'aimerai maintenant me connecter dessus. Je reçois toujours une réponse : "Drivers not loaded".

Voici mon code .h :
#ifndef DBEDWIGE_H
#define DBEDWIGE_H

#include <QWidget>
#include <QString>
#include <QSqlDatabase>
#include <QSqlQuery>

class dbEdwige: public QWidget
{
public :
// constructor : initialise the database
dbEdwige(QString, QString, QString, QString );

[...]
private :
// function : create connexion to the database
void dbConnexion();

// parameters
QSqlDatabase d_db;
QString d_host, d_dbname, d_username, d_pwd;
};
#endif // DBEDWIGE_H
Et voici mon code .cpp :
#include "dbEdwige.h"

#include <QString>
#include <QApplication>
#include <QSqldatabase>
#include <QSqlquery>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlDriver>
#include <QSqlDriverPlugin>

// constructor : initialise the database
dbEdwige::dbEdwige(QString host, QString dbname, QString username, QString pwd ): QWidget(),
d_host(host), d_dbname(dbname), d_username(username), d_pwd(pwd)
{
dbConnexion();
}

[...]

// function : create connexion to the database
void dbEdwige::dbConnexion()
{
d_db.addDatabase("QSQLITE");
d_db.setHostName(d_host);
d_db.setDatabaseName(d_dbname);
d_db.setUserName(d_username);
d_db.setPassword(d_pwd);

if ( !d_db.open() )
{
QMessageBox::warning(this, "Erreur Ouverture", d_db.lastError().text());
}
else
{
QMessageBox::information(this, "Bonne Ouverture", "Connexion BD Ok!");
}
}
Dans mon main :
#include "dbEdwige.h"

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

QString host = "localhost";
QString dbname = "dbEdwige.db";
QString username = "root";
QString pwd = "";
dbEdwige w(host, dbname, username, pwd);
w.show();
return a.exec();
}
Est-ce qu'il y a une erreur dans mon code ?

Je ne suis pas sûre d'avoir bien créé ma base de données :
J'ai en fait executé dans la console : sqlite3 /dbEdwige.sqlite
Puis j'ai fait mes "CREATE [...]"
Comme QT veut des fichiers .db j'ai modifié mon fichier .sqlite en .db.
Est-ce que cela peut venir de là ?

Merci de bien vouloir m'aider (cela fait maintenant environ 10h que j'essaye de trouver une solution!).

Réponses

  • Il n'y a pas une histoire qu'il faut compiler les drivers SqLite au moment de compiler Qt?
    Pour ma part sur Qt 4.3, je crois, j'avais du recompiler Qt car j'avais oublié de compiler le plugin Sqlite...
  • aussi faut ajouter sqlite a ton .pro

    QT+=SQLITE
  • zimba said:
    aussi faut ajouter sqlite a ton .pro

    QT+=SQLITE
    Non, ce n'est absolument pas nécessaire. SQLite est fournit sous forme de plugin et donc tu n'as pas besoin de le spécifier dans ton projet.
    En revanche, il faut qu'il soit compilé pour être utilisable. Ce qui ne semble pas être le cas.
  • Bonjour,
    Merci pour vos réponses.

    Mon problème est résolu :
    d_db.addDatabase("QSQLITE");
    a été remplacé par :
    d_db = QSqlDatabase::addDatabase("QSQLITE");
    Maintenant le problème est que je n'arrive pas à afficher de réponses à mes requêtes...
    Pour tester, j'ai créé un bouton et quand je clique dessus, il effectue une requête toute simple :
    void dbEdwige::faireRequete()
    {
    QString query = "SELECT count(numpromo) FROM PROMO";
    QString title = "Nombre";
    int nb = 1;

    executeSelectQuery(query, nb, title);
    }
    dans executeSelectQuery :
    // function : execute a SELECT query | 'int' determine the number of field
    void dbEdwige::executeSelectQuery(QString query, int nbField, QString titleQuery)
    {
    if( d_db.open() )
    {
    d_log->insertPlainText("Requete : "+query+"\n\nDebut lecture des reponses... \n");
    QSqlQuery q(query, d_db);
    if( q.exec() )
    {
    while( q.next() )
    {
    for( int i=0; i<=nbField; i++)
    {
    QString rep = q.value(i).toString();
    d_log->insertPlainText("Value : " +rep + "\n");
    }
    }
    }
    else
    {
    d_log->insertPlainText("Enregistrement non executé "+d_db.lastError().text()+" \n");
    }
    }
    else
    {
    QMessageBox::warning(this, "Erreur Ouverture", d_db.lastError().text());
    }
    }
    Dans mon interface, "Requete : "+query+"\n\nDebut lecture des reponses... \n" s'affiche puis, c'est le q.exec() qui ne marche pas puisque d_log->insertPlainText("Enregistrement non executé "+d_db.lastError().text()+" \n"); qui s'affiche.

    PS: j'avais déjà rajouté QT += SQL dans mon .pro.
  • Si la connexion est bonne (à savoir que open() revoie bien true), l'erreur vient très probablement de la base en elle-même. Il faudrait que tu nous donnes le message d'erreur qui est renvoyé, sinon on ne pourra pas t'aider plus.
  • Justement c'est bizarre car d_db.lastError().text() ne me renvoie rien !

    De toute façon je pense que je vais abandonner les connexions aux bases de données et je vais utiliser des fichiers car là je n'ai rien touché et ça ne veut même plus compiler : 'QSqlDatabase' does not name a type.
    Cette erreur a apparemment lieu dans mon fichier .h à la ligne : QSqlDatabase d_db;

    Merci beaucoup d'avoir passer du temps pour essayer de régler mes problèmes.
  • Quand tu compiles, tu utilises la commande qmake -project ?
    Si oui, c'est une erreur. Cette commande n'est qu'utilitaire à la création du projet car elle crée un fichier de projet par défaut avec les fichiers que le projet trouve mais n'inclut aucune specificité (comme QT += sql par exemple, nécessaire à l'utilisation de QSqlDatabase).
    C'est dommage de t'arrêter avec les bases de données car les temps d'accès sont généralement plus courts pour des résultats plus simples à traiter. Mais ce n'est que mon point de vue personnel.
Connectez-vous ou Inscrivez-vous pour répondre.