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