Ressources informatiques

Ressources informatiques

Ressources informatiques

Accéder à une base de données MariaDB en Qt

Installer
Installer Qt Linux : Installer la librairie MariaDB Windows : Installer le connecteur ODBC
Créer une application
Se connecter à la base Effectuer une insertion
Effectuer une projection (affichage) Effectuer une projection (utilisation)

Linux : Installer la librairie MariaDB

Installer

doe@debian:~$ su - root
Mot de passe : 
root@debian:~# apt-get install libssl-dev
...
Les NOUVEAUX paquets suivants seront installés :
  libssl-dev libssl-doc zlib1g-dev

root@debian:~# apt-get install  libmysqlclient-dev
...
Les NOUVEAUX paquets suivants seront installés :
  libmysqlclient-dev

Compiler le driver MySQL

Lorsqu'on utilise les classes utilisant le driver QMYSQL, il arrive que le message ci-dessous apparaisse :

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

Cela provient du fait que la librairie utilisée par le driver QMYSQL ne correspond pas à la version en cours.

Librairie utilisée par le driver QMYSQL :

doe@debian:~$ cd Qt/5.7/gcc_64/plugins/sqldrivers/
doe@debian:~/Qt/5.7/gcc_64/plugins/sqldrivers$ ldd libqsqlmysql.so
./libqsqlmysql.so: /usr/lib/x86_64-linux-gnu/libmysqlclient_r.so.16: version `libmysqlclient_16' not found (required by ./libqsqlmysql.so)
...

Le driver MySQL doit être installé en suivant la procédure décrite plus haut : Installer la librairie MySQL. Version en cours :

doe@debian:~$ mysql_config --libs
-L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -ldl
doe@debian:~$ ls /usr/lib/x86_64-linux-gnu/libmysqlclient* -l
...
lrwxrwxrwx 1 root root      20 nov.   6 10:04 /usr/lib/x86_64-linux-gnu/libmysqlclient.so -> libmysqlclient.so.18 
lrwxrwxrwx 1 root root      24 nov.   6 10:04 /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18 -> libmysqlclient.so.18.0.0
-rw-r--r-- 1 root root 3400544 nov.   6 10:04 /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0

Le driver QMYSQL utilise la version 16 de la librairie alors que la version courante est la version 18, il faut donc recompiler le driver. Cela nécessite d'avoir installé les sources de Qt.

doe@debian:~$ cd ~/Qt/5.7/Src/qtbase/src/plugins/sqldrivers/mysql
doe@debian:~/Qt/5.7/Src/qtbase/src/plugins/sqldrivers/mysql$ ls
main.cpp  mysql.json  mysql.pro  README
doe@debian:~/Qt/5.7/Src/qtbase/src/plugins/sqldrivers/mysql$ ~/Qt/5.7/gcc_64/bin/qmake 
doe@debian:~/Qt/5.7/Src/qtbase/src/plugins/sqldrivers/mysql$ ls
main.cpp  Makefile  mysql.json  mysql.pro  README
doe@debian:~/Qt/5.7/Src/qtbase/src/plugins/sqldrivers/mysql$ make	
doe@debian:~/Qt/5.7/Src/qtbase/src/plugins/sqldrivers/mysql$ make install
install -m 755 -p ../../../../plugins/sqldrivers/libqsqlmysql.so /home/doe/Qt/5.7/gcc_64/plugins/sqldrivers/libqsqlmysql.so
strip --strip-unneeded /home/doe/Qt/5.7/gcc_64/plugins/sqldrivers/libqsqlmysql.so
install -m 644 -p /home/doe/Qt/5.7/Src/qtbase/lib/cmake/Qt5Sql/Qt5Sql_QMYSQLDriverPlugin.cmake /home/doe/Qt/5.7/gcc_64/lib/cmake/Qt5Sql/

Vérification :

doe@debian:~$ cd ~/Qt/5.7/gcc_64/plugins/sqldrivers/
doe@debian:~/Qt/5.7/gcc_64/plugins/sqldrivers$ ldd libqsqlmysql.so
	linux-vdso.so.1 (0x00007ffeacff1000)
	libmysqlclient.so.18 => /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18 (0x00007fdb0c10c000)
...

Windows : Installer le connecteur ODBC

Installer le connecteur

Téléchargez le connecteur ODBC MariaDB : mariadb.org : Downloads. Choisissez la dernière version mariadb-connector-odbc-X.X.X-win64.msi.
puis installez ce connecteur

Configurer le connecteur

Allez à : Panneau de configuration\Tous les Panneaux de configuration\Outils d’administration,
Choisissez : Source des données ODBC 64 bits
Choisissez : Source de données utilisateur
Cliquez sur Ajouter et sélectionnez MariaDB ODBC 3.1 Driver
Effectuez la configuration :

Qt ODBC : connecteur

Cliquez sur Next >

Qt ODBC : connecteur

Cliquez sur Test DSN pour valider la configuration

Qt ODBC : connecteur

Cliquez sur OK puis cliquez sur Next > si la connexion a réussi. Vous pouvez cliquer sur Next > à chaque fois pour finir la configuration

Créer une application

Prenons pour sujet d'étude la base meubleFournisseur qui a été créée dans l'article Requêtes SQL. Le serveur MySQL a été installé et un utilisateur créé dans l'article : Installer et utiliser un serveur MySQL.

La ligne ci-dessous est à ajouter dans le fichier .pro afin de pouvoir utiliser les classes QSql... :

QT += sql

Se connecter à la base

Documentation : Qt Documentation : QSqlDatabase Class

...
#include <QSqlDatabase>
...
// Se connecter à la base de données
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setHostName("127.0.0.1");
db.setDatabaseName("Driver={MariaDB ODBC 3.1 Driver};DATABASE=meublefournisseur;");
db.setPort(3306);
db.setUserName("adminBaseMeuble");
db.setPassword("bonjour");
bool connecte = db.open();

Remarque : vous devez avoir installé et configuré le connecteur ODBC: Windows : Installer le connecteur ODBC.

Effectuer une projection

Afficher dans une Table View

Extrait du fichier mainwindow.cpp.La classe QSqlQueryModel est adaptée pour afficher le résultat d'une requête SELECT dans un tableau (QTableView). Documentation : Qt Documentation : QSqlQueryModel Class

...
#include <QSqlQueryModel>
...
if (connecte) {
   // Effectuer la requete	
   QSqlQueryModel *fournisseurs = new QSqlQueryModel();
   QString requete = "SELECT fou_nom, fou_ville FROM fournisseur";
   fournisseurs->setQuery(requete);
   fournisseurs->setHeaderData(0, Qt::Horizontal, "Nom");
   fournisseurs->setHeaderData(1, Qt::Horizontal, "Ville");

   // Afficher le resultat
   ui->tableView->setModel(fournisseurs);
}
...

Résultat :

Qt MySQl : projection
Calculer la somme des prix des meubles du catalogue

Bien sûr le calcul de cette somme peut être fait plus efficacement à l'aide d'une requête SQL, il s'agit ici de montrer, à l'aide d'un exemple simple, comment utiliser les résultats retournés par une requête de type SELECT.

Documentation : Qt Documentation : QSqlQuery Class, Qt Documentation : QSqlRecord Class

...
#include <QSqlQuery>
#include <QSqlRecord>
...
if (connecte) {
// Effectuer la requete
   QSqlQuery requete("SELECT meu_prix FROM meuble");

// Calculer la somme des prix
   float sommePrix = 0;

   int champsPrix = requete.record().indexOf("meu_prix");
   while (requete.next()) {
      sommePrix +=  requete.value(champsPrix).toFloat();
   }

// Afficher le résultat
   ui->textEdit->setText(QString("%1").arg(sommePrix));
}
...

Résultat :

Qt MySQl : projection

Effectuer une insertion

Documentation : Qt Documentation : QSqlQuery Class

...
#include <QSqlQuery>
...
if (connecte) {
   // Preparer la requete
   QSqlQuery requete;
   requete.prepare("INSERT INTO  fournisseur (fou_nom, fou_ville)"
                   "VALUES (?, ?)");
   requete.addBindValue("Ecole Meubles");
   requete.addBindValue("Milly-la-Forêt");

   // Effectuer la requete
   requete.exec();
}
...

Résultat après exécution :

mysql> select * from fournisseur;
+--------+---------------+-----------------+
| fou_id | fou_nom       | fou_ville       |
+--------+---------------+-----------------+
|      1 | G Meubles     | Arpajon         |
|      2 | B Meubles     | Etampes         |
|      3 | H Meubles     | Dourdan         |
|      4 | Ecole Meubles | Milly-la-Forêt  |
+--------+---------------+-----------------+