Bonjour,
désolé de vous déranger avec ça mais ça fait trop longtemps que je suis sur se bug, environ 6 mois même si j'ai fais d'autre trucs à côté. Je suis désespéré ...
J'utilise SQLite sous Qt et j'ai 1 requête sur 1000 qui plante, enfin elle plante pas mais elle écrit de fausses valeurs dans la base de données et ça nique tous mes calculs.
En gros je sauvegarde des pseudo matrices de float dans ma base et des fois certaines requête se retrouve inversé avec les mauvais id comme si mes résultat arrivé pas dans l'ordre. (Et oui j'ai un "ORDER BY" dans ma requête !!!)

Je sais pas trop comment expliquer ce bug donc je vous file le code de ma classe Database.
Désolé, c'est un peu indigeste.

PS : J'effectue BEAUCOUP de requête à la suite sur le même thread.

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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "database.h"
#include "gui/thread.h"
#include "gui/mainwindow.h"
 
Database *t_instance0 = 0; // use in main thread
Database *t_instance1 = 0; // use in first thread
Database *t_instance2 = 0; // use in cards
 
sqlite3 *Database::db;
bool Database::is_open = false;
bool Database::is_opening = false;
 
Database* Database::instance(int database_number)
{
    if(database_number == 0)
    {
        if(t_instance0 == NULL)
            t_instance0 = new Database(0);
        return t_instance0;
    }
    else if(database_number == 1)
    {
        if(t_instance1 == NULL)
            t_instance1 = new Database(1);
        return t_instance1;
    }
    else if(database_number == 2)
    {
        if(t_instance2 == NULL)
            t_instance2 = new Database(2);
        return t_instance2;
    }
    return NULL;
}
 
Database::Database(int database_number)
{
    is_open = false;
    this->database_number = database_number;
    if(is_open == false && is_opening == false)
        initialize(DATABASE);
}
 
int Database::callback(void *a_param, int number_value, char ** value, char ** name_column)
{
    for (int i = 0; i < number_value; i++)
    {
        if(value[i])
        {
            Database::instance((int)a_param)->result_request.push_back(value[i]);
        }
        else
        {
            Database::instance((int)a_param)->result_request.push_back("NULL");
        }
    }
    return 0;
}
 
void Database::delete_all()
{
    if(write("DROP TABLE combos") && write("DROP TABLE states"))
    {
        if(database_number == 0)
            MainWindow::instance()->write("DATABASE ALL DELETE","information");
        else
            Thread::instance()->write("DATABASE ALL DELETE","information");
    }
}
 
void Database::initialize(string file)
{
    if(sqlite3_open(file.c_str(), &db) != 0)
    {
        if(database_number == 0)
            MainWindow::instance()->write("Could not open data base","information");
        else
            Thread::instance()->write("Could not open data base","information");
    }
    else
    {
        is_opening = true;
        if(database_number == 0)
        {
            write("CREATE TABLE combos(id INTEGER PRIMARY KEY, combo VARCHAR(127) UNIQUE)");
            write("CREATE TABLE states(id INTEGER PRIMARY KEY, id_combo INTEGER, score INTEGER, date_added DATETIME, FOREIGN KEY (id_combo) REFERENCES combos(id))");
            write("CREATE TABLE neural_networks(id INTEGER, id_combo INTEGER, clustering_rate REAL, number_input INTEGER, number_hidden_layer INTEGER, number_neuron_layer INTEGER"
                  "FOREIGN KEY (id_combo) REFERENCES combos(id), PRIMARY KEY (id, id_combo))");
            write("CREATE TABLE perceptrons(id INTEGER, id_layer INTEGER, id_nn INTEGER, id_combo INTERGER, weights VARCHAR(255), bias REAL, number_input INTEGER, learning_rate INTEGER, "
                  "FOREIGN KEY (id_nn) REFERENCES neural_networks(id), FOREIGN KEY (id_combo) REFERENCES combos(id), PRIMARY KEY (id, id_layer, id_nn, id_combo))");
 
            write("ALTER TABLE neural_networks ADD COLUMN positive_classifed_well INTEGER");
            write("ALTER TABLE neural_networks ADD COLUMN positive_misclassified INTEGER");
            write("ALTER TABLE neural_networks ADD COLUMN negative_classified_well INTEGER");
            write("ALTER TABLE neural_networks ADD COLUMN negative_misclassified INTEGER");
 
            write("ALTER TABLE states ADD COLUMN random REAL");
 
        }
        if(database_number == 0)
            MainWindow::instance()->write((string)"Opened database " + to_string(database_number),"information");
        else
            Thread::instance()->write((string)"Opened database " + to_string(database_number),"information");
        is_open = true;
    }
}
 
bool Database::write(string sql)
{
    char *error = "database is not open";
    if(sqlite3_exec(db, sql.c_str(), callback, (void*)this->database_number, &error) != (SQLITE_OK || SQLITE_CONSTRAINT_UNIQUE))//can used callback function
    {
        if(database_number == 0)
            MainWindow::instance()->write("Request execute with success", "current_information");
        else
            Thread::instance()->write("Request execute with success", "current_information");
        return true;
    }
    else
    {
        if(database_number == 0)
            MainWindow::instance()->write((string)"Error : " + error, "information");
        else
            Thread::instance()->write((string)"Error : " + error, "information");
        return false;
    }
}
 
bool Database::read(string sql)
{
    this->result_request.clear();
 
    return write(sql);
}
Et je sais ce que vous allez dire alors NON, l'erreur ne viens pas d'ailleurs et mes requêtes sont bien écrient car elles fonctionnent correctement dans 99.9% des cas !!!
Es-ce que vous auriez des pistes ? ou des réponses ?