IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Discussion :

Supprimer le warning : 'qt_sql_default_connection' is still in use


Sujet :

Bases de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par défaut Supprimer le warning : 'qt_sql_default_connection' is still in use
    Bonjour,

    J'essaie de faire une programme qui fait l'affichage de du contenu d'une table mySql.
    L'affichage se passe bien, mais lors de la fermeture de la fenetre, le warning suivant s'affiche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QSqlDatabasePrivate::removeDatabase: connection 'qt_sql_default_connection' is still in use, all queries will cease to work.
    Pour l'enlever, j'ai essaye de faire "close" et "removeDatabase", mais je continue a avoir le meme souci.

    Mon code est le suivant (en commentaire ce que j'ai essaye sans succes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    Grid::Grid(QWidget *parent)
        : QWidget(parent)
    {
    	ui.setupUi(this);
     
    	//Connecting to the DB
    	connectDb();
     
    	//Configuring model
    	QSqlTableModel * model = new QSqlTableModel;
    	model->setTable("TableTest");
    	model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    	model->select();
     
        model->setHeaderData(0, Qt::Horizontal, QObject::tr("val1"));
        model->setHeaderData(1, Qt::Horizontal, QObject::tr("val2"));
        model->setHeaderData(2, Qt::Horizontal, QObject::tr("val3"));
        model->setHeaderData(3, Qt::Horizontal, QObject::tr("val4"));
     
    	ui.tableView->setModel(model);
    	ui.verticalLayout->addWidget(ui.tableView);
    	setLayout(ui.verticalLayout);
     
     
    	QString connection = _db.connectionName();
    	qDebug() << connection;
     /**
            QSqlDatabase::database( connection ).close();
            QSqlDatabase::removeDatabase( connection );*/
     
    }
     
    Grid::~Grid()
    {
    	//Closing DB
    	_db.close();
     
    	//Removing DB
    	_db.removeDatabase("qt_sql_default_connection");
    	QSqlDatabase::removeDatabase("qt_sql_default_connection");
     
    	if (_db.isOpen())
    		qDebug() << "Still opened ?!";
     
    	if (_db.isValid())
    		qDebug() << "Still valid ?!";
     
    	/*
    	QString connection = _db.connectionName();
     
    	//Closing DB
    	_db.close();
     
    	//Removing DB
    	QSqlDatabase::removeDatabase(connection);
     
    	QSqlDatabase::database( connection ).close();
    	QSqlDatabase::removeDatabase( connection );
    	*/
    }
     
     
    QSqlDatabase Grid::connectDb()
    {
        _db = QSqlDatabase::addDatabase("QMYSQL");
     
        _db.setHostName("localhost");
        _db.setDatabaseName("Qt4TestDB");
        _db.setUserName("Qt4");
        _db.setPassword("123456");
     
        if (!_db.open())
        	qDebug() << "Failed to connect to root mysql admin";
     
        return _db;
    }

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        Grid w;
        w.show();
        int aRc = a.exec();
     
     //   QSqlDatabase::database("qt_sql_default_connection").close();
     //   QSqlDatabase::removeDatabase("qt_sql_default_connection");
     
        return aRc;
    }

    Je vous remercie d'avance pour votre aide.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour

    Un warning très classique (j'ai un stagiaire qui l'a eu récemment) A priori, le problème vient du fait que lorsque tu essaies de fermer ta base de données, tu as encore des requêtes actives dessus. En l’occurrence, je pense que c'est ta QSQLTableModel, que tu construis dynamiquement sans donner de parent et que tu ne détruis pas (c'est pas bien, il ne faut pas hésiter à utiliser le système parent-enfant de Qt quand on peut).

    Ça devrait fonctionner.

    EDIT : sur le forum Qt Dev Net, on parle aussi de créer la base de données sur le tas et d'appeler delete avant de faire un removeDatabase :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    QSqlDatabase Grid::connectDb()
    {
       _db = new  QSqlDatabase(QSqlDatabase::addDatabase("QMYSQL"));
       ...
    }
     
    Grid::~Grid() // par symétrie, tu pourrais créer une fonction closeDb() ?
    {
       QString dbname = db.connectionName();
       _db->close();
       delete _db;
       QSqlDatabase::removeDatabase(dbname );
       ...
    }

  3. #3
    Membre confirmé Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par défaut
    bonjour gbdivers,
    Je viens de modifier selon tes explications, mais je trouve le meme probleme...


    Au fait, ca serait comment avec l'histoire du "parent" ?

  4. #4
    Membre confirmé Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par défaut
    J'ai trouve. En plus des indications de gbdivers, il fallait faire un delete de l'allocation pointee par le pointeur "model".

    Sinon, je trouve que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    _db = new  QSqlDatabase(QSqlDatabase::addDatabase("QMYSQL"));
    n'est pas super beau, pourrait quelqu'un me dire une facon elegante de le faire ?

  5. #5
    Membre confirmé Avatar de donkeyquote
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 195
    Par défaut
    Excusez-moi, j'ai demande une stupidite ?

    gbdivers dit :
    En l’occurrence, je pense que c'est ta QSQLTableModel, que tu construis dynamiquement sans donner de parent et que tu ne détruis pas (c'est pas bien, il ne faut pas hésiter à utiliser le système parent-enfant de Qt quand on peut).
    QSQLTableModel et QSqlTableModel n'ont pas de systeme "garbage collector" parent-enfant dans le constructeur que je sache (au moins je n'ai pas vu dans la definition).

    Je pense que faire un "new" avec un constructeur par copie sur une instance statique ne me semble pas super beau...

    Je n'ai jamais travaille avec le framework de la lib Qt, pourriez-vous m'indiquer comment on fait d'habitude pour que ca soit plus clean ?

  6. #6
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par donkeyquote Voir le message
    QSQLTableModel et QSqlTableModel n'ont pas de systeme "garbage collector" parent-enfant dans le constructeur que je sache (au moins je n'ai pas vu dans la definition).
    Hum... Il n'y a déjà pas de garbage collector avec Qt, juste un système qui instaure des relations parent-enfant et qui ne laisse pas vivre les enfants sans leur parent.

    Sinon, prends la documentation http://qt.developpez.com/doc/4.7/QSqlTableModel, regarde l'arbre des classes http://qt.developpez.com/doc/arbre/330/QSqlTableModel/, tu peux remonter jusque QObject. Plus simplement, tu regardes le constructeur : s'il prend un QObject en premier paramètre, c'est que la classe hérite de QObject et qu'elle utilise le système de parenté.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

Discussions similaires

  1. Comment supprimer ce warning ?
    Par laurentSc dans le forum Langage
    Réponses: 4
    Dernier message: 22/03/2012, 11h04
  2. comment supprimer les warning gcc
    Par uriotcea dans le forum C++
    Réponses: 21
    Dernier message: 29/04/2009, 09h55
  3. Réponses: 1
    Dernier message: 19/12/2008, 17h32
  4. Supprimer les Warnings sur certains répertoire
    Par ALX79 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 22/01/2008, 18h49
  5. Réponses: 8
    Dernier message: 01/03/2005, 22h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo