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

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

Effectuer des requêtes sur la base

Affichage sans contraintes : affichage de tous les fournisseurs

Dans ce cas, il n'est pas nécessaire d'utiliser les requêtes préparées

Programme source
/**
 * @file selectEnCMysql.c
 * Compilation: gcc -o selectEnCMysql selectEnCMysql.c `mariadb_config --cflags --libs`
 * Exécution : ./selectEnCMysql -u <user> -p <password>
 * Ce programme affiche les données de la table fournisseur de la base de données meubleFournisseur
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <getopt.h>
#include <mysql.h>

#define HOTE "localhost"
#define NOM_BASE "meubleFournisseur"

/* Fonction pour afficher l'usage du programme */
void usage(const char *prog_name) {
    fprintf(stderr, "Usage: %s -u <user> -p <password>\n", prog_name);
    exit(1);
}

int main(int argc, char *argv[]) {
    MYSQL *pMysql;
    MYSQL_STMT *stmt;
    MYSQL_BIND param[2];

    char *user = NULL, *password = NULL;
    int opt;

    // Analyser les arguments avec getopt
    while ((opt = getopt(argc, argv, "u:p:")) != -1) {
        switch (opt) {
            case 'u':
                user = optarg;
                break;
            case 'p':
                password = optarg;
                break;
            default:
                usage(argv[0]);
        }
    }

    if (user == NULL || password == NULL ) {
        usage(argv[0]);
    }

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

    /* Se connecter à la base de données */
    if (mysql_real_connect(pMysql, HOTE, user, password, NOM_BASE, 0, NULL, 0) == NULL) {
        fprintf(stderr, "mysql_real_connect() échoué : %s\n", mysql_error(pMysql));
        mysql_close(pMysql);
        return -1;
    }

    printf("Contenu de la table fournisseur :\n");

    /* Afficher le contenu de la table fournisseur */
    if (mysql_query(pMysql, "SELECT fou_nom, fou_ville FROM fournisseur") != 0) {
        fprintf(stderr, "Erreur SELECT : %s\n", mysql_error(pMysql));
        mysql_close(pMysql);
        return -1;
    }

    MYSQL_RES *result = mysql_store_result(pMysql);
    if (result == NULL) {
        fprintf(stderr, "Erreur mysql_store_result : %s\n", mysql_error(pMysql));
        mysql_close(pMysql);
        return -1;
    }

    int num_fields = mysql_num_fields(result);
    MYSQL_ROW row;
    MYSQL_FIELD *fields = mysql_fetch_fields(result);

    // Afficher les noms de colonnes
    for (int i = 0; i < num_fields; i++) {
        printf("%s\t", fields[i].name);
    }
    printf("\n");

    // Afficher les lignes
    while ((row = mysql_fetch_row(result))) {
        for (int i = 0; i < num_fields; i++) {
            printf("%s\t", row[i] ? row[i] : "NULL");
        }
        printf("\n");
    }

    mysql_free_result(result);
    mysql_close(pMysql);

    return 0;
}
Compilation
adminX@serveurWebX:~$ gcc -o selectEnCMysql selectEnCMysql.c `mariadb_config --cflags --libs`

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

Exécution
adminX@serveurWebX:~$ ./selectEnCMysql -u adminBaseMeuble1 -p bonjour
Contenu de la table fournisseur :
fou_nom fou_ville
A Meubles       Arpajon
E Meubles       Etampes
D Meubles       Dourdan
B Meubles       Brétigny