Dans l’article qui suit, nous allons installer le connecteur C++ pour la base de données MySQL (aussi bien sous GNU/Linux que sous Microsoft Windows). Puis nous présenterons quelques exemples d’applications en manipulant une base de test.
Prérequis
Pour commencer il faut se rendre sur le site officiel pour lire ce que propose MySQL concernant ce connecteur : https://dev.mysql.com/doc/connector-cpp/en/connector-cpp-introduction.html
J’ai déjà installé sur ma machine Linux/Debian un serveur MySQL ainsi que phpMyAdmin pour faciliter la gestion des bases. La base de test s’appelle ‘olivier_db’ et la table qui subira quelques unes de nos requêtes ‘animal’. Les champs de cette table sont présentés ci-dessous:
Un utilisateur ‘olivier’ a été créé avec le mot de passe ‘olivier’. Tous les droits lui sont donnés sur cette base et il pourra se connecter depuis n’importe quelle adresse IP. Elle contient au départ deux enregistrements :
Installation et premier test sous GNU/Linux Debian 10 Buster
On suppose qu’un compilateur C++ est installé (sinon faire la commande suivante: apt-get install build-essential). La version du compilateur est la 4.9.2. Pour installer notre connecteur C++ pour MySQL il suffit d’installer les paquets suivants :
libmysqlcppconn-dev – MySQL Connector for C++ (development files)
libmysqlcppconn7v5 – MySQL Connector for C++ (library)
Cela entraîne l’installation automatique des paquets suivants:
libboost-dev libboost1.67-dev
root@casimir:/home/olivier/Documents/# apt install libmysqlcppconn7v5 libmysqlcppconn-dev
Lecture des listes de paquets… Fait
Construction de l’arbre des dépendances
Lecture des informations d’état… Fait
Les paquets supplémentaires suivants seront installés :
libboost-dev libboost1.67-dev
Rien de spécial à dire. L’installation se passe rapidement. Testons alors un premier exemple en modifiant un code donné ici :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
// Test connecteur C++ MySQL // O. Dartois, Juin 2017 //#include <stdlib.h> #include <iostream> // Les includes strictement nécessaire pour cet exemple #include <cppconn/driver.h> #include <cppconn/exception.h> #include <cppconn/resultset.h> #include <cppconn/statement.h> using namespace std; int main(void) { cout << endl; cout << "Premier test du connecteur C++ Mysql" << endl; // La gestion d'erreur se fait proprement avec les exceptions // sinon retirer le try...catch try { // Les variables nécessaires à notre programme sql::Driver* driver; sql::Connection* con; sql::Statement* stmt; sql::ResultSet* res; // Etape 1 : créer une connexion à la BDD driver = get_driver_instance(); // on note les paramètres classiques: adresse ip du serveur et port, login, mot de passe con = driver->connect("tcp://127.0.0.1:3306", "olivier", "olivier"); // Etape 2 : connexion à la base choisie, ici olivier_db con->setSchema("olivier_db"); // Etape 3 : création d'un objet qui permet d'effectuer des requêtes sur la base stmt = con->createStatement(); // Etape 4 : exécution d'une requete : ici on sélectionne tous les enregistrements // de la table Animal res = stmt->executeQuery("SELECT * FROM Animal"); // Etape 5 : exploitation du résultat de la requête while (res->next()) { cout << "\t... MySQL a repondu: "; // Acces par non du champ de la table : ici le champ 'id' que l'on recupère au format string cout << res->getString("id") << endl; cout << "\t... MySQL la suite : "; // Acces à la donnée par son numéro de colonne, 1 étant le premier (ici 'id'), 5 le nom de l'animal cout << res->getString(5) << endl; } // On nettoie tout avant de sortir : effacement des pointeurs // le pointeur sur le Driver sera effacé tout seul delete res; delete stmt; delete con; } catch (sql::SQLException &e) { // Gestion des execeptions pour déboggage cout << "# ERR: " << e.what(); cout << " (code erreur MySQL: " << e.getErrorCode(); cout << ", EtatSQL: " << e.getSQLState() << " )" << endl; } cout << endl; // on sort en indiquant que tout c'est bien passé return EXIT_SUCCESS; } |
Le code précédent se compile avec la ligne ci-dessous, on exécute ensuite le programme:
1 2 3 4 5 6 7 8 |
root@casimir:/home/olivier/Documents/TestConnectionMySQLC++# g++ -o connexMySQL testconnectionmysqlcpp.cpp -Wall -lmysqlcppconn root@casimir:/home/olivier/Documents/TestConnectionMySQLC++# ./connexMySQL Premier test du connecteur C++ Mysql ... MySQL a repondu: 1 ... MySQL la suite : Diva ... MySQL a repondu: 2 ... MySQL la suite : mirza |
L’exécution correspond bien a ce que l’on attend : deux enregistrements, l’affichage de la valeur de l’id et du nom pour chaque résultat.
Si on met une valeur erronée pour le mot de passe, on obtient à l’exécution le message ci-dessous. Les exceptions fonctionnent correctement.
1 2 3 |
root@casimir:/home/olivier/Documents/TestConnectionMySQLC++# ./connexMySQL Premier test du connecteur C++ Mysql # ERR: Access denied for user 'olivier'@'localhost' (using password: YES) (code erreur MySQL: 1045, EtatSQL: 28000 ) |
Réalisons une insertion d’un enregistrement. Ci-dessous la partie de code modifié par rapport au code précédent. Attention il n’y a plus d’étape 5 :
1 2 3 4 5 6 7 |
... // Etape 4 : exécution d'une requete : ici on insere un enregistrement // dans la table Animal string req = "INSERT INTO Animal VALUES(NULL,'chien','M', NOW(), 'medor', 'chien rare')"; int result = stmt->executeUpdate(req); cout << "Resultat INSERT: " << result << endl; ... |
Cette fois-ci la requête est dans une string. Pour réaliser une commande INSERT, UPDATE ou DELETE, il faut utiliser la méthode executeUpdate(). Pour la commande SELECT, la méthode executeQuery() car elle renvoie un type ResultSet* (voir cette discussion).
L’entier de retour (result) de la méthode executeUpdate() indique le nombre de lignes modifiées. Ci-dessous le résultat de trois exécution du code précédent:
Nous en avons terminé avec GNU/Linux. Passons à présent avec Microsoft Windows.
Installation et premier test sous Microsoft Windows
Il faut tout d’abord lire les recommandations d’Oracle sur l’installation sous Microsoft Windows ici. On en déduit que l’on va télécharger deux archives:
- l’archive zip du connecteur c++ pour windows ( lien ), choisir comme système d’exploitation Microsoft Windows puis l’archive en version 32 bits
- la bibliothèque boost en version zip ou mieux 7zip ( lien )
Je vous conseille très vivement d’installer 7Zip pour Windows sinon vous allez passer quelques heures à décompresser l’archive de boost…. Une fois ces deux archives décompressées sur votre disque dur (notez les chemins), il faut créer votre projet avec Microsoft Visual Studio (pour ma part VS2017).
- Créer un nouveau projet Visual C++, Choisissez Win32 puis Application console Win32. Faire un projet vide (décochez en-tête précompilé puis cochez Projet vide)
- TRÈS IMPORTANT: choisissez le mode ‘Realease’ lorsque vous ferez les ajouts des lignes suivantes. (Les tests en mode Debug ont échoué…)
- Faites un clic droit sur votre projet dans la fenêtre explorateur de solutions. Sélectionnez Ajouter puis Élément existant… Cherchez dans votre répertoire ou vous avez désarchivé le connecteur c++, le fichier ‘mysqlcppconn.lib’ puis ajoutez-le
- Faites un clic droit sur votre projet dans la fenêtre explorateur de solutions. Sélectionnez Propriétés puis Répertoire VC++ puis l’item ‘Répertoires Include’. Rajoutez alors deux chemins : un vers la librairie Boost (par exemple: c:\xxx\yyy\boost_1_64_0) et un vers la librairie mysql-connector (par exemple c:\xxx\zzz\mysql-connector-c++-noinstall-1.1.9-win32\include)
Nous allons utiliser exactement le même code que sous GNU/Linux, donc copier-collez le dans un nouveau fichier cpp de votre projet (pour moi, ça sera source.cpp). La seule modification de code est l’adresse ip dans la méthode connect() :
1 2 |
// Adresse ip du serveur de BDD : 192.168.1.107 : Debian 8 en WiFi con = driver->connect("tcp://192.168.1.107:3306", "olivier", "olivier"); |
Compilez et exécutez le code. Si tout se passe bien vous obtiendrez la même sortie que l’exécutable sous GNU/Linux.
Si vous n’arrivez pas à vous connecter, il est possible que le serveur MySQL n’accepte pas les connexions distantes. Sous Debian 8 Jessie, éditez le fichier ‘/etc/mysql/my.cnf’ puis commentez (mettre un # devant la ligne) la ligne ‘bind-address=’ puis relancez le service MySQL.
Conclusion
Dans la mesure du possible, il faudra désormais utiliser cette bibliothèque dans les futurs codes de projets ou de TPs. Pour aller plus loin dans l’exploration de cette bibliothèque, il faut télécharger les sources car elles contiennent un répertoire ‘exemples’. La description des exemples est disponible ici.
Bonjour super tuto, cependant j’aimerai savoir comment dans commande insert into … Values ( …, …, … ) je peut mettre des variable int ou float dans les champs?
Bonjour BOSSERT,
Je me permet de te répondre,
Comme tu as pu le voir les requêtes SQL sont envoyée sous forme de chaines de caractères :
string req = « INSERT INTO Test VALUES(‘texte’,’18’,’23.048′) »;
int result = stmt->executeUpdate(req);
Il te suffit de composer une chaine de caractère en concaténant tes valeurs à celles-ci.
La bibliothèque standard du C++ (STL) dispose d’outils performants pour ce genre de chose.
Je penses notamment à std::ostringstream :
#include
std::string text = « texte »;
int value1 = 18;
float value2 = 23.048f;
std::ostringstream req;
req << "INSERT INTO Test VALUES('";
req << text << "','";
req << value1 << "','";
req << value2 <executeUpdate(req.str());
Le ostringstream se manipule comme un flux de sortie (std::cout) mais pointe sur un buffer de caractères et non sur le buffer de sortie standard.
On récupère une std::string depuis ce flux via la fonction membre str()
Bon courage !
Désolé pour les caractères manquant ou transformés dans mon messages précédent,
ils ont dû se faire manger par les htmlspecialchars() et autres stripslashes() de php…
Mais l’essentiel y est et je t’invite à lire la doc de la lib standard pour plus d’infos.
Salut,
Merci pour le tuto.
J’ai des problème au niveau de l’ajout de la librairie, ça ne fonctionne toujours pas
Peut-tu m’aider?
PS: quand je compile, il a une fênetre avec l’erreur suivante » Impossible d’exécuter le code, car mysqlcppconn-7-vs14.dll est introuvable. «