MySql et QT

publicité
Programmation sous QT
Accès aux bases de données MySQL
La création du projet
Dans le .pro il est nécessaire d'ajouter QT += sql pour que la gestion des bases de
données soit prise en compte avec QT.
La connexion à la base de données
QSqlDriver est une classe abstraite pour accéder à une base de données SQL
spécifique. Elle permet donc de spécifier le driver nécessaire. Pour MySql, il est
nécessaire de préciser QMYSQL.
QSqlDatabase est la classe qui représente la connexion à la base de données. Cette
classe fournit une interface pour accéder à une base de données via une connexion. Une
instance de QSqlDatabase, représentant la connexion, permet d'accéder à la base de
données via l'un des pilotes de base de données pris en charge, qui sont issus de
QSqlDriver.
Voici un exemple code permettant de se connecter à la base de données :
1.
2.
3.
4.
5.
6.
7.
8.
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("Cenotech");
db.setUserName("root");
db.setHostName("127.0.0.1");
db.setPassword("cenotech");
if(db.open())
qDebug() << "Ouverture de la base de données avec succès";
else qDebug() << "Echec d'ouverture de la base de données";
Ligne 1:
Information sur le driver, ici QMYSQL est cité (pour une utilisation de base
MySQL)
Ligne 2:
Nom de la base de données utilisé
Ligne 3:
Nom d'utilisateur
Ligne 4:
Adresse où se trouve la base
Ligne 5:
Le mot de passe d'accès à la base
Ligne 6-7-8: Permet de connaître l'état de la connexion, un message dans le la sortie de
l'application s'affiche en fonction de cet état.
L'envoi de requête Sql
QSqlQuery fournit un moyen d'exécuter et de manipuler les requêtes SQL. Cette classe
encapsule les fonctionnalités impliquées dans la création, la navigation et la récupération
de données à partir de requêtes SQL qui sont exécutées sur un QSqlDatabase. Elle peut
être utilisé pour exécuter le langage de manipulation de données (DML) telles que
SELECT, INSERT, UPDATE et DELETE ainsi que le langage de définition de données
(DDL) telles que CREATE TABLE.
Par exemple voici une requête récupérant le montant des TVA possible dans la table tva :
1.
2.
3.
4.
QSqlQuery query("SELECT montant_tva FROM tva;");
if(query.exec())
qDebug() << "Ouverture de la base de données avec succès";
else qDebug() << "Echec d'ouverture de la base de données";
L'envoi d'une requête Sql préparée
La fonction QsqlQuerry ::prepare() prédispose la requête SQL à l'exécution, elle permet
de construire des requêtes contenant des éléments variables. Cette fonction renvoie un
booléen pour confirmer ou non la préparation de la requête. Une seconde fonction,
bindValue(), associe une valeur à un nom correspondant dans la requête SQL préparée.
Ensuite, la fonction exec() qui exécute la requête Sql qui l'appelle. Un booléen est
retourné pour confirmer ou non l'exécution de la requête.
Voici un exemple pour récupérer l'id du type d'un produit, selon son propre id :
1.
2.
3.
4.
5.
QSqlQuery query;
int idDuProduitDontOnVeutIdType = 22;
query.prepare("SELECT id_type FROMproduit WHERE id_produit=:idProduit;");
query.bindValue(":idProduit",idDuProduitDontOnVeutIdType);
bool retour = query.exec();
Ligne 1:
Déclaration de la requête.
Ligne 2:
Déclaration et initialisation d'un id.
Ligne 3:
Préparation à l'envoi de la requête, la valeur à mettre à jour est celle précédée
de « : »
Ligne 4:
Association de l'id et de la valeur dans la requête.
Ligne 5:
Envoi de la requête.
D'autre fonctions comme addBindValue() utilise des marqueurs avec des « ? » Pour
préparer la requête. L'ordre des « ? » doit être respecté.
1.
QSqlQuery query;
2.
3.
4.
5.
//Marqueurs ?
query.prepare("UPDATE matable SET monchamp1=?, monchamp2=?;");
query.addBindValue("Coucou");
query.addBindValue(42);
Traitement du résultat de la requête
Afin de traiter les résultats de la requête, la fonction next() est utilisée. En effet, elle
récupère le dernier résultat enregistre et positionne la requête sur ce résultat. Si une liste
d’éléments est attendue, on peut associer cette fonction a une boucle tant que (while) pour
récupérer chacun des résultats.
La fonction value() permet de récupérer la valeur positionnée en fonction de l'entier passe
en paramètre de cette fonction. Les champs sont numérotés de gauche a droite lors de
l'utilisation de SELECT, plusieurs valeurs peuvent être retournées.
Exemple : récupération des champs description et id_produit dans la table produit :
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
10.
11.
12.
13.
14.
15.
if(query.exec("SELECT description, id_produit FROM produit ;"))
{
QString laDescription ;
int idProduit ;
while(query.next())
{
laDescription = query.value(0).toString();
idProduit = query.value(1).toInt() ;
ui->lineComboDescription->addItem(laDescription);
ui->lineComboIdProduit->addItem(QString::number(idProduit)) ;
}
}
else
{
qDebug() << "Erreur Chargement nom des sites";
}
La valeur 0 représente ici le champ description, la valeur 1 représente le champ id_produit
pour le paramètre de la fonction value().
L'utilisation de cette fonction avec une requête SELECT * n'est pas recommandée puisque
l'ordre des champs n'est pas défini.
Liens utiles :
http://doc-snapshots.qt.io/4.8/qsqlquery.html#record
http://openclassrooms.com/courses/maitrisez-les-bases-de-donnees-avec-qtsql
Téléchargement