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 :

Database is locked, unable to fetch row


Sujet :

Bases de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 8
    Points : 8
    Points
    8
    Par défaut Database is locked, unable to fetch row
    Bonjour à tous

    J'utilise une base de données de type SQLite dans mon programme Qt.
    Cette base s'appelle "base.db".
    J'ai créé des tables, j'ajoute, je supprime, je modifie et ce, sans aucun probème.

    Mais voilà qu'à un moment, je me ramasse cette vilaine erreur:
    database is locked Unable to fetch row
    Là, je dois avouer que je ne vois pas bien ce qui peut locker ma BDD.

    Voici ma fonction: (qui a pour but de changer le champ "echeance" (de type DATE) dans la BDD à l'enregistrement "id" passé en argument.)
    Le moment qui bloque est mis en évidence.

    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
    void calendrier::valide_reporte_tache(const int &id){
     
        //Stockage de la date
        QDate nouvelle_echeance;
     
        //Récupération de l'ancienne date
        //Connexion à la BDD
        QSqlDatabase base = QSqlDatabase::addDatabase("QSQLITE");
        base.setDatabaseName("base.db");
        //Erreur d'ouverture de la base -> exit();
        if(!base.open()){
    	QMessageBox::critical(this, QString::fromUtf8("Erreur critque"), QString::fromUtf8("Une erreur critique est survenue lors de l'ouverture de la base de données.\nLe programme va maintenant s'arrêter.\nVeuillez nous excuser pour ce problème."));
    	exit(EXIT_FAILURE);
        }
     
        //Récupération de la date (c'est la seule chose qui nous intéresse)
        QSqlQuery recupere_date = base.exec("SELECT echeance FROM taches WHERE id = "+QString::number(id));
        //Si erreur de requête, on quitte.
        if(recupere_date.isValid()){
    	QString message_erreur = QString::fromUtf8("Une erreur est survenue lors de la lecture des tâches dans la base de données.\nVoici l'erreur qui s'est produite:\n")+recupere_date.lastError().text();
    	//Fermeture de la BDD
    	base.commit();
    	base.close();
    	QMessageBox::critical(this, QString::fromUtf8("Erreur lors de la lecture"), message_erreur);
    	return;
        }
        //Lecture du premier enregistrement
        recupere_date.next();
        QDate date_temp = QDate::fromString(recupere_date.value(0).toString(), "yyyy-MM-dd");
     
        //calendrier_report est un QCalendarWidget précédemment déclaré.  On récupère juste la date sélectionnée
        QDate date_calendrier = calendrier_report->selectedDate();
     
        //Simple vérification pour voir s'il y a eu changement de date
        if(date_calendrier == date_temp){
    	    QMessageBox::warning(this, QString::fromUtf8("Dates identiques"), QString::fromUtf8("La date de report que vous avez choisie est identique à celle actuelle.  Veuillez choisir une autre date.  Merci."));
    	    return;
    	}
    	else{
    	    nouvelle_echeance = date_calendrier;
    	}
     
        //Si on est ici, c'est que tout c'est bien passé.
        //Donc, on met à jour la BDD.
    //---------------------------------------------------
    //BUG DANS LE QSqlQuery!!!!!
    //---------------------------------------------------
        QSqlQuery update_base = base.exec("UPDATE taches SET echeance = '"+nouvelle_echeance.toString("yyyy-MM-dd")+"' WHERE id = "+QString::number(id));
        if(recupere_date.isValid()){
    	QString message_erreur = QString::fromUtf8("Une erreur est survenue lors de la lecture des tâches dans la base de données.\nVoici l'erreur qui s'est produite:\n")+update_base.lastError().text();
    	//Fermeture de la BDD
    	base.commit();
    	base.close();
    	QMessageBox::critical(this, QString::fromUtf8("Erreur lors de la lecture"), message_erreur);
    	return;
        }
    //---------------------------------------
    //Une erreur s'est produite.  La fonction passe dans "if(recupere_date.isValid())"
    //---------------------------------------
     
        //Fermeture de la BDD
        base.commit();
        base.close();
     
    return;
    }
    Voilà, j'espère que mon petit code est clair.
    Une précision tout de même. la fonction "isValid()" retourne TRUE s'il y a eu une erreur et FALSE si tout c'est bien passé.

    J'ai testé le UPDATE directement dans la BDD (via SQLiteManager dans Firefox) et la requête fonctionne.

    Quelqu'un voit-il ce qui locke ma base de données?

    Merci d'avance à tous.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Points : 119
    Points
    119
    Par défaut
    Bonjour,

    Je me pose une question :
    recupere_date.isValid() retourne true si la requête se trouve sur un enregistrement valide.
    Or donc vous testez si la requête se termine sur un enregistrement valide, et si c'est le cas vous dites "il y a un problème".
    A mon sens, il y a là une erreur. Ce devrait plutôt être l'inverse. Il faudrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!recupere_date.isValid()){...
    Non?

    Espérant avoir pu être d'une quelconque utilité

    A bientôt
    M.P.

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/09/2014, 21h51
  2. database is locked
    Par jockerse dans le forum JDBC
    Réponses: 3
    Dernier message: 05/05/2014, 14h38
  3. [Généralités] WINDEV + SQLITE database is locked
    Par sperchey dans le forum WinDev
    Réponses: 2
    Dernier message: 15/01/2013, 21h00
  4. [Ubuntu / SQLITE_BUSY] Problème "The database file is locked (database is locked)"
    Par PP(Team) dans le forum Plateformes (Java EE, Jakarta EE, Spring) et Serveurs
    Réponses: 1
    Dernier message: 05/10/2012, 10h32
  5. database level lock
    Par gbidon dans le forum Hibernate
    Réponses: 0
    Dernier message: 08/06/2010, 09h46

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