Accéder à une base de données MariaDB en Qt
| Installer Qt | Linux : Installer la librairie MariaDB |
Windows : Installer le connecteur ODBC |
| 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 :
Cliquez sur Next >
Cliquez sur Test DSN pour valider la configuration
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 :
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 :
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 | +--------+---------------+-----------------+