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.