Ressources informatiques

Ressources informatiques

Ressources informatiques

Accéder à une base de données MariaDB en langage C

Documentation : MariaDB Connector/C API Functions

Prenons pour sujet d'étude la base meubleFournisseur qui a été créée dans l'article Requêtes SQL. Le serveur MariaDB a été installé et un utilisateur créé dans l'article : Installer et utiliser un serveur MariaDB.

Installer le connecteur C - MariaDB

doe@debian:~$ su - root
Mot de passe :
root@debian:~# apt-get install libmariadbd-dev

Effectuer des requêtes sur la base

Insertion

Programme source
/*
 * nom         : insertEnCMysql.c
 * compilation : suivant les installations
 *     gcc -o  insertEnCMysql `mysql_config --cflags --libs` insertEnCMysql.c
 *  OU 
 *     gcc -o  insertEnCMysql `mariadb_config --cflags --libs` insertEnCMysql.c
 */

#include <stdio.h> // pour fprintf()
#include <string.h> //pour strlen()
#include <mysql.h>

#define HOTE "localhost"
#define NOM_BASE "meubleFournisseur"
#define USER "adminBaseMeuble"
#define PASSWORD "bonjour"

int main() {
    MYSQL *pMysql;
    char requeteSql[] = "INSERT INTO fournisseur (fou_nom, fou_ville) VALUES ('G Meubles','Arpajon')";

    /* Initialiser la structure MySQL */
    if ((pMysql = mysql_init(NULL)) == NULL)
    {fprintf(stderr, "mysql_init(): %s\n", mysql_error(pMysql)); return -1;}

    /* Se connecter a base de donnees */
    if (mysql_real_connect(pMysql, HOTE, USER, PASSWORD, NOM_BASE, 0, NULL, 0) == NULL)
    {fprintf(stderr, "mysql_real_connect(): %s\n", mysql_error(pMysql));  mysql_close(pMysql); return -1;}

    /* Executer la requete : inserer un element */
    if (mysql_real_query(pMysql,requeteSql,strlen(requeteSql)) != 0)
    {fprintf(stderr, "mysql_real_query(): %s\n", mysql_error(pMysql));  mysql_close(pMysql); return -1;}

    /* Fermer la connexion a la base */
    mysql_close(pMysql);

    return 0;
}
Compilation

Pour pouvoir compiler, il est nécessaire d'utiliser les fichiers d'en-tête .h et la librairie lib*.so de la bibliothèque MySQL.
La commande mysql_config --cflags --libs fournit les informations nécessaires à la compilation.
Remarque : il peut être nécessaire de remplacer mysql_config par mariadb_config

doe@debian:~$ gcc -o  insertEnCMysql `mysql_config --cflags --libs` insertEnCMysql.c
Exécution
doe@debian:~$ ./insertEnCMysql
Vérification
doe@debian:~$  mysql -u adminBaseMeuble -p meubleFournisseur
Enter password:
mysql> select * from fournisseur;
+--------+-----------+-----------+
| fou_id | fou_nom   | fou_ville |
+--------+-----------+-----------+
|      1 | G Meubles | Arpajon   |
+--------+-----------+-----------+

Projection

Programme source
/*
 * nom         : selectEnCMysql.c
 * compilation : suivant les installations
 *     gcc -o  selectEnCMysql `mysql_config --cflags --libs` selectEnCMysql.c
 *  OU 
 *     gcc -o  selectEnCMysql `mariadb_config --cflags --libs` selectEnCMysql.c
 */

#include <stdio.h> // pour fprintf()
#include <string.h> //pour strlen()
#include <mysql.h>

#define HOTE "localhost"
#define NOM_BASE "meubleFournisseur"
#define USER "adminBaseMeuble"
#define PASSWORD "bonjour"

int main() {
    MYSQL *pMysql;
    MYSQL_RES *result;
    MYSQL_ROW row;
    unsigned int numRows;

    char requeteSql[] = "SELECT fou_nom, fou_ville  FROM fournisseur;";

    // Initialiser la structure MySQL 
    if ((pMysql = mysql_init(NULL)) == NULL)
    {fprintf(stderr, "mysql_init(): %s\n", mysql_error(pMysql)); return -1;}

    // Se connecter a base de donnees 
    if (mysql_real_connect(pMysql, HOTE, USER, PASSWORD, NOM_BASE, 0, NULL, 0) == NULL)
    {fprintf(stderr, "mysql_real_connect(): %s\n", mysql_error(pMysql));  mysql_close(pMysql); return -1;}

    // Executer la requete : afficher 
    if (mysql_real_query(pMysql,requeteSql,strlen(requeteSql)) != 0)
    {fprintf(stderr, "mysql_real_query(): %s\n", mysql_error(pMysql));  mysql_close(pMysql); return -1;}

    result = mysql_store_result(pMysql);
    if (result) {  // there are rows
        // Traiter les resultats
        while ((row = mysql_fetch_row(result))) {
           printf("fou_nom : %s, fou_ville : %s\n", row[0], row[1], row[2]);
        }

        // Liberer les resultats
        mysql_free_result(result);
    }

    // Fermer la connexion a la base 
    mysql_close(pMysql);

    return 0;
}
Compilation
doe@debian:~$ gcc -o  selectEnCMysql `mysql_config --cflags --libs` selectEnCMysql.c

Remarque : il peut être nécessaire de remplacer mysql_config par mariadb_config

Exécution
doe@debian:~$ ./selectEnCMysql
fou_nom : G Meubles, fou_ville : Arpajon