Bonjour
Je crée un appli Qt C++ avec connexion a une base de données. J'utilise le driver ODBC (pas réussi a recompiler le driver OCI, mais la n'est pas le sujet).
Je désire créer une classe RequestMaker qui gère tous les acces à la base.
Mon pb est la suivant:
Bien que je déclare à ma classe RequestMaker un arttribut m_db qui est un QSqlDatabase (correctement ouvert dans le constructeur),
cet attribut n'est pas conservé pour les appels de méthode autre que le contraucteur.
Si dans ma méthode query1 je veux utiliser cette connexion m_db (par exemple pour executer une query dessus),
he bien il faut que je re-définisse m_db avec un m_db = QSqlDatabase::database("xxx"). POURQUOI ?
Idem pour mon attribut m_query, il faudra a chaque fois que je le re-définisse avec un QSqlQuery m_query(m_db);
Merci de votre aide
déclaration :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 class RequestMaker { public: RequestMaker(); //constructeur bool query1(); //appel d'un requete bool query2(); //appel d'une autre requete private: QSqlDatabase m_db; //connexion à la base QSqlQuery m_query; //requete sur cette connexion };
définition :
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 RequestMaker::RequestMaker() //constructeur { QSqlDatabase m_db = QSqlDatabase::addDatabase("QODBC", "xxx"); m_db.setDatabaseName("xxx"); m_db.setUserName("xxx"); m_db.setPassword("xxx"); bool ok = m_db.open(); if (!ok) { qDebug() << m_db.lastError(); QMessageBox::critical(0, QString("Cannot open database"), QString (m_db.lastError().text()).toAscii(), QMessageBox::Cancel, QMessageBox::NoButton); } else { QMessageBox::information(0, QString("Connected to database"), "Connected to database", QMessageBox::Cancel, QMessageBox::NoButton); // <- je passe bien ici à l'execusion => ma base m_db est bien ouverte QSqlQuery m_query(m_db); //si connecté, on crée la query qui point sur la base m_db } } bool RequestMaker::query1() { m_db = QSqlDatabase::database("xxx"); // <- Si je ne recrée pas ma base m_db, ca ne marche pas => POURQUOI ? bool open = m_db.open(); if (!open) { QMessageBox::information(0, "Database not opened", m_db.lastError().text().toAscii(), QMessageBox::Cancel, QMessageBox::NoButton); } QSqlQuery m_query(m_db); // idem, si je ne recrée pas ma query sur ma base, ca ne fonctionne pas => POURQUOI ? bool ok = m_query.exec("UPDATE XXX SET OWNER='moimoimoi' WHERE ZZZ = 1"); return true; }
Partager