Formations à l'informatique et à l'électronique

Auteur : SD
Créé le : 27-10-2017

Qt - Accéder à une base de données MySQL

Logo Qt Creator

Qt offre un module contenant plusieurs classes liées à SQL. Pour un accès à une base de données MySQL, il faut utiliser les classes "QSqlDatabase" et "QSqlQuery".

Pour utiliser ces classes, il faut les inclure dans le fichier en-tête :

#include <QtSql>

Et ajouter dans le fichier .pro :

QT += sql

Exemple de code

Dans le .h

private:
QSqlDatabase dbMeteo;

Dans le .cpp

// Instanciation de la variable membre dbMeteo
dbMeteo = QSqlDatabase::addDatabase("QMYSQL");

// Définition des paramètres de connexion à la base de données
dbMeteo.setHostName("192.168.8.19"); // @ip serveur MySQL
dbMeteo.setDatabaseName("Meteo"); // Nom de la base
dbMeteo.setUserName("sd"); // Nom utilisateur
dbMeteo.setPassword("12345"); // Mot de passe

if(dbMeteo.open()) {
qDebug() << "Ok - ouverture de la base de donnée";

// Exécution d'une requête
QSqlQuery requete;
if(requete.exec("SELECT * FROM Meteo")) {
qDebug() << "Ok - requete";

// Boucle qui permet de parcourir les enregistrements renvoyés par la requête
while(requete.next()) {
// On accède ici aux différents champs par leurs noms, il est également possible
// d'y accéder par leur index : requete.value(0)
qDebug() << requete.value("Date") << " " << requete.value("Temp1") << " "
<< requete.value("Temp2") << " " << requete.value("Pression")
<< requete.value("Humidite ");
}
}
else {
qDebug() << "Echec de la requête";
// La méthode lastError permet d'afficher un message
// plus explicite sur les causes de l'erreur
qDebug() << requete.lastError();
}
dbMeteo.close(); // Fermeture de la base de données
}
else {
qDebug() << "Echec d'ouverture de la base de donnée";
qDebug() << dbMeteo.lastError();
}

La méthode "value()" renvoie un "QVariant". Pour le transtyper, il faut utiliser les méthodes "toXxx" de la classe "QVariant" :

QDate laDate = requete.value("Date").toDate();
QTime heure = requete.value("Heure").toTime();
float temperature = requete.value("Temp2").toFloat();
int humidite = requete.value("Humidite ").toInt();

Erreurs possibles

QMYSQL driver not loaded

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

Le driver MySQL manquant est "libmysql.dll". A télécharger sur mysql.com, choisir la version .zip en 32 ou 64 bits selon votre compilateur.

Décompresser le zip téléchargé et copier le ficher ./lib/libmysql.dll dans le dossier où se trouve le .exe de votre application.

2003 QMYSQL: Unable to connect 10061

QSqlError("2003", "QMYSQL: Unable to connect", "Can't connect to MySQL server on '192.168.8.19' (10061)")

Ici le problème ne vient pas du code Qt mais du serveur MySQL. Par défaut le serveur MySQL "écoute" seulement sur son interface "localhost". Autrement dit si votre code Qt ne s'exécute pas sur la même machine que le serveur MySQL, la connexion sera rejetée.

Solution :

Sur un serveur Ubuntu, il faut commenter la ligne "bind-address = 127.0.0.1" du fichier "/etc/mysql/mysql.conf.d/mysqld.cnf" (sur un Raspberry Pi, c'est le fichier "/etc/mysql/my.cnf).

puis redémarrer le service MySQL :

sudo service mysql restart

Référence

Documentation Qt SQL C++ Classes

Articles connexes

Articles sur Qt


Vous avez apprécié cet article ? Partagez le !

Article connexe : Qt - Écrire dans un fichier texte