Blog ENI : Toute la veille numérique !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
💥 Les 22 & 23 novembre : Accès 100% GRATUIT
à la Bibliothèque Numérique ENI. Je m'inscris !
  1. Livres et vidéos
  2. Maîtrisez Qt
  3. Qt Sql
Extrait - Maîtrisez Qt Guide de développement d'applications professionnelles (3e édition)
Extraits du livre
Maîtrisez Qt Guide de développement d'applications professionnelles (3e édition)
1 avis
Revenir à la page d'achat du livre

Qt Sql

Objectifs

Qt fournit des solutions intégrées pour accéder aux données sur des serveurs du type SQL. Leur utilisation est extrêmement simple grâce à des API de haut niveau conçues de telle sorte que la connexion à une base de données couvre toute l’application et que l’exécution d’une requête et la lecture des données résultantes se fassent dans le même objet.

À moins que vous n’ayez recompilé Qt pour y intégrer les drivers de bases de données, la connexion à une base de données se fait par l’intermédiaire d’un plug-in Qt. Parmi ceux-ci vous trouverez : Db2, Interbase, MySQL, OCI, ODBC, PostgreSQL, SQLite (versions 2 et 3) et Symbian SQL.

En fonction de la base de données que vous utiliserez, vous devrez veiller à ce que votre environnement système soit conforme aux exigences du serveur de données pour que tout fonctionne correctement. Par exemple, l’environnement d’un client Oracle devra être correctement configuré sous peine de voir votre programme dysfonctionner, en dépit d’une programmation correcte.

Le code source est disponible dans le projet Qt Sql.

Intégration

Le module Qt Sql est intégré à votre projet grâce à l’ajout du mot-clé sql dans la déclaration QT de votre fichier .pro.

QT += sql 

Persistance des données

Dans une application il est très courant que les données soient stockées sur un serveur de bases de données du type MySQL, Oracle ou encore PostgreSQL. Cela n’est pas la seule raison pour laquelle le développeur peut être amené à utiliser le système de requêtes SQL. En effet, lorsqu’il s’agit de la persistance des données de l’application, la seule classe QSettings n’est ni suffisante ni adaptée. La plupart du temps, les données saisies par l’utilisateur seront stockées dans un fichier texte, XML ou une base de données SQL embarquée du type SQLite.

1. Utilisation d’un serveur de données

Nous regrouperons dans la catégorie des serveurs de données les serveurs comme MySQL et Oracle auxquels le programme accède à travers un flux réseau. Nous ajouterons dans cette catégorie les bases de données fichier du type SQLite car, même s’il ne s’agit pas à proprement parler d’un serveur, l’accès aux données se fait exactement de la même manière qu’avec un SGBD.

2. Ce que Qt Sql permet et ne permet pas

Qt Sql est une API qui permet au développeur d’exécuter des requêtes SQL sur un serveur de données. Ces requêtes peuvent être...

Connexion au serveur de données

La connexion à un serveur est possible grâce à la classe QSqlDatabase. Celle-ci utilise le patron de conception singleton, vous ne devez pas l’instancier, mais déclarer une connexion en lui donnant un nom :

QSqlDatabase::addDatabase(const char* driver, QString nom = QString()) ; 

Si vous vous connectez à plusieurs serveurs de données en même temps, cela vous permettra de différencier les connexions aisément.

QSqlDatabase::addDatabase("QSQLITE", "db1") ; //Connexion nommée db1 
QSqlDatabase::addDatabase("MYSQL", "db2") ; //Connexion nommée db2 

Cet objet est accessible n’importe où dans votre application, en particulier dans vos DAO, il n’est pas nécessaire de stocker la référence ou le pointeur quelque part.

Pour ouvrir un fichier SQLite il vous suffira d’utiliser la fonction setDatabaseName().

QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE") ; 
db.setDatabaseName("Le chemin du fichier") ; 
if(db.open()) 
   qDebug() << "Fichier ouvert" ; 
else 
   qDebug() << "Erreur" ; 

Pour vous authentifier sur un serveur SQL, vous devrez utiliser les fonctions setHostName(), setUserName() et setPassword().

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL") ; ...

Effectuer une requête

Toutes les requêtes s’exécutent de la même manière, quel que soit leur type. Certaines renvoient des résultats (SELECT), d’autres non (UPDATE, DELETE, INSERT). La réussite des opérations effectuées peut être contrôlée après l’exécution d’une requête.

Nous distinguerons deux étapes dans l’exécution d’une requête sur un serveur :

1.

Initialisation et exécution.

2.

Contrôle de l’exécution et lecture du résultat.

1. La requête

L’exécution d’une requête peut se faire uniquement sur une base de données ouverte. Une requête, quel que soit son type, est effectuée grâce à une instance de la classe QSqlQuery.

Constructeurs de QSqlQuery

QSqlQuery(QSqlResult* result) 
QSqlQuery(const QString& query = QString(), QSqlDatabase db = 
   QSqlDatabase())  
QSqlQuery(QSqlDatabase db) 

Il peut être instancié avec ou sans requête en argument. Dans le premier cas, la requête sera exécutée immédiatement après l’instanciation. Dans le second cas, il faudra appeler la fonction exec() sur l’instance de QSqlQuery pour procéder à son exécution. Nous recommandons d’utiliser la fonction exec() car celle-ci renvoie une valeur booléenne qui permet de contrôler la bonne exécution de la requête.

Si le développeur a défini plusieurs connexions nommées, il devra passer en paramètre l’instance de QSqlDatabase. S’il ne possède qu’une seule connexion et ne l’a pas nommée, l’instanciation d’un QSqlQuery utilisera directement la connexion par défaut.

Il est possible d’obtenir des informations plus précises que l’échec ou la réussite d’une requête de modification grâce aux fonctions lastInsertId() et numRowsAffected(). La première renvoie la dernière clé primaire créée lors d’une insertion d’enregistrement dans une table, à condition que la clé primaire possède l’attribut AUTO_INCREMENT. La deuxième fonction renvoie le nombre d’enregistrements...