Comment accéder à MySQL en utilisant l'API C

Vous trouverez une explication sur l'accès à une base de données MySQL à partir d'un programme écrit en C/C++ en natif (sans les MFC, ATL ou autres librairies).

Ce qu'il faut installer et connaître

Il faut tout d'abord disposer d'un compilateur C++. On utilisera VC++ de Visual Studio 2005 ou 2008 (ou bien d'un autre IDE).

Il faut également installer le gestionnaire de la base de donnée.
Nous choisissons MySQL et plus précisément la release 5.
Pour ma part, j'ai installé mysql-essential-5.0.45-win32.msi mais une version 5.1 marchera autant sinon mieux !

Attention, lors de l'installation, il faut choisir une installation personnalisé _comme expliqué ici_ (custom) et cocher l'option installer la lib et les includes, après on doit copier les fichiers .h et les .lib de MySQL dans le repertoire ???\VC\include\mysql et ???\VC\lib de Visual Studio (2008 pour ma part).

Ce n'est pas la peine de s'embêter à copier la DLL, elle est déjà mise dans le répertoir Windows par l'installateur de MySQL.

Si on veut gérer la BD, il serait intéressant d'installer phpMyAdmin, l'outil le plus connus pour administrer la BD MySQL. Il est écrit en php et nécessite un serveur http installé sur la machine (EasyPHP installe tous ces outils pour vous : Apache, MySQL, PHP et phpMyAdmin).

Arrivé à cette étape, on va crée une table exemple manuellement.
Là quelques notions de MySQL, connexion, table, reqêtes... sont nécessaires. Je vous invite à taper ces mots clefs sur Google ou aller sur developpez.com


Table MySQL

Les lignes qui vont suivre, sont à coller dans une fenêtre de requêtes SQL de phpMyAdmin par exemple.
Elle vont servir à créer une table ex_1 dans la base de donnée test (à sélectionner au préalable), puis ils vont enrichir la table de 5 enregistrements :
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de données: `test`
--
-- --------------------------------------------------------
--
-- Structure de la table `ex_1`
--
DROP TABLE IF EXISTS `ex_1`;
CREATE TABLE `ex_1` (
  `id` int(11) NOT NULL auto_increment,
  `nom` tinytext NOT NULL,
  `prenom` tinytext NOT NULL,
  `date_naissance` date NOT NULL default '0000-00-00',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 COMMENT='ma premiere table' AUTO_INCREMENT=6 ;
--
-- Contenu de la table `ex_1`
--
INSERT INTO `ex_1` VALUES(1, 'Dupont', 'Denis', '1977-09-18');
INSERT INTO `ex_1` VALUES(2, 'Dupont', 'Marie', '1978-02-09');
INSERT INTO `ex_1` VALUES(3, 'Sheen', 'Sylvain', '1970-12-22');
INSERT INTO `ex_1` VALUES(4, 'Sand', 'Kamal', '1971-05-30');
INSERT INTO `ex_1` VALUES(5, 'Fisher', 'Samia', '1973-10-28');



Exemple d'utilisation de l'API C MySQL

Cet exemple montre comment on peut, à l'aide d'un compilateur C, se connecter à la base de donnnées, faire des requêtes, récupérer le résultat et l'afficher.
On présente une capture d'écran qui montre le résultat attendu.




Voici le listing du programme qui interroge la base de données :
   
// mysql_ex1.cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <conio.h>
#include <winsock.h>
#include <mysql\mysql.h>

int _tmain(int argc, _TCHAR* argv[])
{
    MYSQL mysql;
        mysql_init(&mysql);
        mysql_options(&mysql,MYSQL_READ_DEFAULT_GROUP,"option");

        if(mysql_real_connect(&mysql,"127.0.0.1","root","a","test",0,NULL,0))
            {
            //Déclaration des pointeurs de structure
            MYSQL_RES *result = NULL;
            MYSQL_ROW row = NULL;

            unsigned int i = 0;
            unsigned int num_champs = 0;

            printf("Lister le nombre de resultats :\n");
            //Requête qui sélectionne tout dans ma table ex_1
            mysql_query(&mysql, "SELECT * FROM ex_1");
            //On met le jeu de résultat dans le pointeur result
            result = mysql_use_result(&mysql);
            //Tant qu il y a encore un résultat ...
            while (( row =  mysql_fetch_row(result)))
              {
              printf("Resultat %ld\n", i);
              i++;
              }

            //Libération du jeu de résultat
            mysql_free_result(result);

// Cette fois, on va lire les données
            printf("\nCette fois, on va lire les donnees :\n");
            //à nouveau la requête qui sélectionne tout dans ma table ex_1
            mysql_query(&mysql, "SELECT * FROM ex_1");
            result = mysql_use_result(&mysql);
            //On récupère le nombre de champs
            num_champs = mysql_num_fields(result);
            while (( row =  mysql_fetch_row(result)))
              {
              //On déclare un pointeur long non signé pour y stocker la taille des valeurs
              unsigned long *lengths;
              //On stocke cette taille dans le pointeur
              lengths = mysql_fetch_lengths(result);
              //On fait une boucle pour avoir la valeur de chaque champs
              for(i = 0; i < num_champs; i++)
                {
                //On ecrit toutes les valeurs
                printf("[%.*s] ", (int) lengths[i], row[i] ? row[i] : "NULL");
                }
              printf("\n");
              }

            //Fermeture de MySQL
            mysql_close(&mysql);
            }
        else
            {
            printf("Une erreur s est produite lors de la connexion à la BDD!");
            }

  printf("\nAppuyez sur une touche\n");
  _getch();
  return 0;
}
 

Il faut créer un projet Win32 console application, puis coller le listing ci-dessus et ne pas oublier d'ajouter dans les Propriétés du projet, pour toutes les configurations (Release et Debug), dans \Linker\Input\Additional dependencies : libmysql.lib

Exemple avec projet pour Visual Studio 2008, VC : mysql_ex1.zip



Liens


Installation :
phpMyAdmin
MySQL version 5.1
EasyPHP

Ressource MySQL
Tutorial MySQL (developpez.com)

MySQL C API : références et tutorial
Doc de l'API
Reference des fonctions de l'API C MySQL

Ressource VC++
Tuto MySQL API - C
Autre tuto MySQL API- C

Encapsulation de la MySQL C API en C++ (facultatif)
MySQL++ : official C++ wrapper for MySQL’s C API
Autre encapsulation





Note : L'auteur décline toute responsabilité quand à l'usage qui sera fait de ces programmes.


Retour à la page principale