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 :

Base de données toujours utilisée par le processus après appel à la fonction close()


Sujet :

Bases de données

  1. #1
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut Base de données toujours utilisée par le processus après appel à la fonction close()
    Bonsoir à tous,

    Dans l'un de mes programmes j'utilise QtSql pour travailler avec une base de données SQLite (appelée pour l'exemple base1.db).

    L'utilisateur du programme doit pouvoir, s'il le souhaite, faire une mise à jour de cette base depuis une autre importée (base2.db). Pour cela je ferme base1.db avec la fonction close() et je lance la manip voulue.

    Le souci est qu'à ce moment j'ai un message d'erreur qui apparaît me disant que la base est déjà utilisée par un autre processus et la mise à jour ne se fait pas.

    La seule solution actuelle pour faire cette mise à jour est donc de fermer le programme et de lancer cette dernière avant même d'avoir utiliser base1.db.

    Il me semblait que la fonction close() libérait les ressources, mais à priori chez moi ça bogue. Quelqu'un aurait il une piste.

    D'avance merci.

    PS : J'ai aussi essayé avec removeDatabase(), mais sans succès.
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  2. #2
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut


    Plutôt que résolu, j'ai contourné le problème... J'ai effectivement choisi de mettre à jour base1.db via un fichier .xml contenant les informations à mettre à jour. Ceci permet de cette base ouverte et donc de m'affranchir du problème que je rencontrai.

    Merci à ceux qui avaient pris le temps de lire ma demande.

    Bon week end.
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par cegDv Voir le message
    PS : J'ai aussi essayé avec removeDatabase(), mais sans succès.

    J'ai un peu le même soucis. En quittant mon programme, j'ai toujours ceci dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    QSqlDatabasePrivate::removeDatabase: connection '1' is still in use, all queries will cease to work.
    Voici ma fonction pour fermer la base
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    FenetreEscalade::~FenetreEscalade()
    {
        QString identifiant = m_baseSQL.connectionName() ;
        m_baseSQL.close();
        QSqlDatabase::removeDatabase(identifiant);
    }
    Pourquoi ce message d'erreur ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Points : 40
    Points
    40
    Par défaut
    C'est bien expliqué ici : http://qt.developpez.com/doc/latest/...removeDatabase

    Sois tu fais un finish sur tes requêtes ou tu détruis l'objet.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par kangs Voir le message
    C'est bien expliqué ici : http://qt.developpez.com/doc/latest/...removeDatabase

    Sois tu fais un finish sur tes requêtes ou tu détruis l'objet.

    J'ai bien lu la doc mais je n'y arrive pas. Je n'ai pas de requêtes en cours... Et comment détruire l'objet ?

  6. #6
    Membre régulier Avatar de COGAN
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 109
    Points : 116
    Points
    116
    Par défaut
    Je traine aussi ce poids depuis fort longtemps !!!
    Obliger d'arrêter et relancer l'application pour revenir sur une base déjà ouverte...
    Je comprends pas

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 23
    Points : 40
    Points
    40
    Par défaut
    Citation Envoyé par migrec Voir le message
    J'ai bien lu la doc mais je n'y arrive pas. Je n'ai pas de requêtes en cours... Et comment détruire l'objet ?
    L'objet à détruire est un QSqlQuery.
    Soit tu utilises des pointeurs tu dois faire soit faire un delete soit appeler la fonction finish. (mais finish s'utilise dans des cas particulier, je t'aurais bien mis un lien mais je vais m'abstenir)

    Le problème peut venir du fait que tu as une vue utilisant QSqlQueryModel qui est toujours active (ou un QSqlTableModel)
    Ces objects ont une copie de l'objet QSqlQuery.
    Dans ce cas détruit les objets affichant des requêtes ou table avant d'appeler le removeDatabase.

    Si ce n'est pas ca ton problème, je n'ai pas vraiment d'autre idée.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par kangs Voir le message
    L'objet à détruire est un QSqlQuery.
    Soit tu utilises des pointeurs tu dois faire soit faire un delete soit appeler la fonction finish. (mais finish s'utilise dans des cas particulier, je t'aurais bien mis un lien mais je vais m'abstenir)

    Le problème peut venir du fait que tu as une vue utilisant QSqlQueryModel qui est toujours active (ou un QSqlTableModel)
    Ces objects ont une copie de l'objet QSqlQuery.
    Dans ce cas détruit les objets affichant des requêtes ou table avant d'appeler le removeDatabase.

    Si ce n'est pas ca ton problème, je n'ai pas vraiment d'autre idée.
    Ah oui, ça pourrait venir de ça. Mes données issues de la QSqlDatabase sont traitées via un QSqlTableModel (que j'ai surclassé en MyTableLicences) et affiché dans un QTableView qui emploie une série de QSortFilterProxyModel de cette façon :
    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
        m_licences->setTable("licences");
        m_licences->select() ;
     
        // Définition des filtres
        m_filtreNumero = new QSortFilterProxyModel();
        m_filtreAS = new QSortFilterProxyModel() ;
        m_filtrePrenom = new QSortFilterProxyModel() ;
        m_filtreCategorie = new QSortFilterProxyModel() ;
        m_filtreSexe = new QSortFilterProxyModel() ;
        m_filtreNom = new QSortFilterProxyModel() ;
        m_filtreEtablissement = new QSortFilterProxyModel() ;
        m_filtreVille = new QSortFilterProxyModel() ;
     
        // Mise en place des filtres en chaine pour le proxy
        m_filtreNumero->setSourceModel(m_licences);
     
        m_filtreNom->setSourceModel(m_filtreNumero);
        m_filtreNom->setFilterCaseSensitivity(Qt::CaseInsensitive) ;
     
        m_filtrePrenom->setSourceModel(m_filtreNom);
        m_filtrePrenom->setFilterCaseSensitivity(Qt::CaseInsensitive) ;
     
        m_filtreCategorie->setSourceModel(m_filtrePrenom);
        m_filtreCategorie->setFilterCaseSensitivity(Qt::CaseInsensitive) ;
     
        m_filtreSexe->setSourceModel(m_filtreCategorie);
        m_filtreSexe->setFilterCaseSensitivity(Qt::CaseInsensitive) ;
     
        m_filtreAS->setSourceModel(m_filtreSexe);
        m_filtreAS->setFilterCaseSensitivity(Qt::CaseInsensitive) ;
     
        m_filtreEtablissement->setSourceModel(m_filtreAS);
        m_filtreEtablissement->setFilterCaseSensitivity(Qt::CaseInsensitive) ;
     
        m_filtreVille->setSourceModel(m_filtreEtablissement);
        m_filtreVille->setFilterCaseSensitivity(Qt::CaseInsensitive) ;
     
        // L'affichage est lié au dernier filtre de la chaine
        vueLicences->setModel(m_filtreVille) ;
    J'ai rajouté un lastError après le close sur l'objet QSqlDatabase et j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    QSqlError(-1, "Error closing database", "unable to close due to unfinalised statements") 
    QSqlDatabasePrivate::removeDatabase: connection '2' is still in use, all queries will cease to work.
    J'ai essayé en faisant delete sur tous les QSortFilterproxyModel mais sans résultat !

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 32
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par kangs Voir le message
    L'objet à détruire est un QSqlQuery.
    Le problème peut venir du fait que tu as une vue utilisant QSqlQueryModel qui est toujours active (ou un QSqlTableModel)
    Ces objects ont une copie de l'objet QSqlQuery.
    Dans ce cas détruit les objets affichant des requêtes ou table avant d'appeler le removeDatabase.

    Si ce n'est pas ca ton problème, je n'ai pas vraiment d'autre idée.
    Effectivement, j'avais un objet QSqlTableModel qui était instancé dans une fonction appelée par le contructeur.

    Avec ça dans le destructeur ou la fonction closeEvent(), j'y suis arrivé !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete m_licences
    delete m_parametres

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 16/07/2008, 16h44
  2. [1.x] Prise en charge de 2 bases de données SQL Server par Symfony
    Par technopole dans le forum Symfony
    Réponses: 1
    Dernier message: 04/03/2008, 13h15
  3. Comment connaître la mémoire utilisée par un processus ?
    Par David dans le forum API, COM et SDKs
    Réponses: 11
    Dernier message: 17/01/2008, 15h01
  4. Réponses: 5
    Dernier message: 24/08/2007, 15h42
  5. la mémoire utilisée par un processus
    Par LN(a) dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 22/04/2006, 14h28

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