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 | +--------+---------------+-----------------+