Bienvenue sur le forum !

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

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

[Qt4-Linux] Pointeur sur QSqlDatabase ?

Bonjour,

Pour une application qui utilise SQLite, je souhaite mettre en place un pointeur sur une variable QSqlDatabase afin d'accéder à cette base de données depuis mes dialogues qui s'ouvrent à partir de ma fenêtre principale.

Sans pointeur, la base est correctement ouverte mais avec un pointeur, le code suivant me retourne "Driver not loaded Driver not loaded"... Je ne comprend pas trop pourquoi car j'ai bien ceci dans listeDB : "Drivers : ("QSQLITE", "QMYSQL3", "QMYSQL") "
bool fenetre_principale::baseConnecter(QString nomFichier)
{
base = new QSqlDatabase() ;
base->addDatabase("QSQLITE") ;
base->setDatabaseName(nomFichier) ;

QStringList listeDB = QSqlDatabase::drivers () ;
qDebug() << "Drivers :" << listeDB ;

// On ouvre la base de données
if (!base->open())
{
QMessageBox::critical(this,"Impossible d'ouvrir la base de données", base->lastError().text()) ;
return false ;
}
qDebug() << "La base de données a été ouverte !" ;
return true ;
}
Comment faire ?

Réponses

  • Tu ne peux pas fonctionner de la sorte.
    addDatabase() est une fonction statique et ne s'applique donc pas à une instance en particulier. C'est addDatabase qui te renvoie l'objet database nécessaire à la connexion à ta base de données.
  • Ma base de données est ouverte dans ma fenêtre principale.
    Ce que je souhaite, c'est y accéder (ajouter, modifier, supprimer, afficher) depuis mes fenêtres filles... Comment faire ?

    Pour l'instant, j'arrive juste à afficher les colonnes dans un QSqlTableModel mais après je bloque... Je ne sais pas si le problème vient de la base en elle-même ou si c'est ailleurs !

    Merci pour toute aide !
  • Dans ta fenêtre principale, tu crées ta base de données en lui donnant un nom de connexion (différent du nom de la base de données, c'est simplement une sorte d'identifiant).
    QSqlDatabase db = QSqlDatbase::addDatabase("QSQLITE", "monNomDeConnexion");
    Pour retrouver ta base de données dans une autre classe / fenêtre (en conservant son état d'ouverture), tu fais simplement :
    QSqlDatabase db = QSqlDatabase::database("monNomDeConnexion");
  • J'ai donc mis cette commande dans le constructeur de ma fenêtre et un peu partout dans le code de la fenêtre principale en attendant d'affiner...
    Du coup, je me retrouve avec des :
    QSqlDatabasePrivate::addDatabase: duplicate connection name 'qt_sql_default_connection', old connection removed.

    Pas grave, j'affinerais plus tard, car pour l'instant, j'arrive à avoir mes données !!
  • La fonction addDatabase() n'est à utiliser qu'une seule fois !
    Les autres fois, tu utilises database().
  • Désolé, erreur dans mon message pas dans le code. J'appelle bien addDatabase() une fois et database() les autres fois !
  • Peux-tu montrer les commandes addDatabase() et database() telles qu'elles sont dans ton code (avec tous les paramètres) ?
  • Dans fenetre_principale::fichierNouveau() :
        QSqlDatabase base = QSqlDatabase::addDatabase("QSQLITE") ;
    base.setDatabaseName(nomFichier) ;
    //...
    QSqlQuery result = base.exec("CREATE TABLE licences (id INTEGER PRIMARY KEY, numerolicence INTEGER, numeroas INTEGER, nom VARCHAR(40), prenom VARCHAR(40))") ;
    base.commit();
    base.close();
    Dans fenetre_principale::fichierOuvrir() :
    // ...
    baseConnecter(nomFichier) ;
    Dans fenetre_principale::baseConnecter :
    bool fenetre_principale::baseConnecter(QString nomFichier)
    {
    QSqlDatabase base = QSqlDatabase::addDatabase("QSQLITE") ;
    base.setDatabaseName(nomFichier) ;
    // On ouvre la base de données
    if (!base.open())
    {
    QMessageBox::critical(this,"Impossible d'ouvrir la base de données", base.lastError().text()) ;
    return false ;
    }
    qDebug() << "La base de données a été ouverte !" ;
    return true ;
    }
    Et dans le constructeur de ma fenetre fille :
        QSqlDatabase base = QSqlDatabase::database() ;
    modeleLicences = new QSqlTableModel ;
    modeleLicences->setTable("licences") ;
    licencesVue->setModel(modeleLicences) ;
    Et enfin dans la fonction d'importation des données :
    void Fenetre_Gestion_Licences::importerDonnees()
    {
    QSqlDatabase base = QSqlDatabase::database() ;
    / ...
    C'est pas optimisé tout ça, j'ai des messages avec qDebug surtout lorsque je crée une nouvelle base de donnée et lorsque je l'ouvre manuellement après. Je me concentre sur l'importation des données en ce moment !
  • Oui, en fait, tu n'as pas du tout suivi mes instructions...

    J'avais bien précisé qu'il fallait utiliser l'instruction :
    QSqlDatabase::addDatabase("QSQLITE", "monNomDeConnexion");
    et
    QSqlDatabase::database("monNomDeConnexion");
    Si tu dois ouvrir plusieurs fois la base, il faut penser aussi à appeler :
    QSqlDatabase::removeDatabase("monNomDeConnexion");
  • J'ai suivi tes instructions en les adaptant du mieux que j'ai pu... Je me suis aidé de la doc :
    - avec QSQLITE, le monNomDeConnexion doit être fixé au nom de fichier de la base. Je n'arrive plus à retrouver la partie de la doc qui m'a indiqué ça...
    - QSqlDatabase::database() retourne la connexion par défaut, donc la dernière si plusieurs bases de données ont été ouvertes. Et comme je me base sur le nom de fichier pour SQLite, ça revient au même, non ?

    Ceci dit, il doit y avoir un soucis quelque part car mon appli mets prêt de 3 minutes à importer mes 10000 lignes contre moins d'une secondes avec un couple QTableView / QStandardItemModel !

    En tout cas merci pour ton aide précieuse !!
  • Attention, il faut différencier ce que j'appelle le "nomDeConnexion" (qui correspond au paramètre connectionName de addDatabase() dans la doc) du nom de la base de données (attribué par la fonction setDatabaseName().
    Le nom de connexion permet d'identifier une connexion parmi toutes celles que tu peux créer avec ton programme, et deux connexions ne peuvent avoir le même nom. C'est pour cela que si tu crées deux connexions sans leur donner de nom la première est supprimée car la deuxième prend aussi le nom par défaut (qui est qt_sql_default_connection, nom que tu as obtenu dans le message d'erreur).
Connectez-vous ou Inscrivez-vous pour répondre.