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 avec contraintes : affichage des fournisseurs de la ville de Brétigny
Dans ce cas, il est ipmératif 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 fournisseurs de la ville de Brétigny */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <getopt.h> #include <mysql.h> #define HOTE "localhost" #define NOM_BASE "meubleFournisseur" 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; char *user = NULL, *password = NULL; int opt; 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]); } if ((pMysql = mysql_init(NULL)) == NULL) { fprintf(stderr, "mysql_init() échoué : %s\n", mysql_error(pMysql)); return -1; } 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; } // Préparer la requête avec un paramètre const char *sql = "SELECT fou_nom, fou_ville FROM fournisseur WHERE fou_ville = ?"; stmt = mysql_stmt_init(pMysql); if (!stmt) { fprintf(stderr, "mysql_stmt_init() échoué\n"); mysql_close(pMysql); return -1; } if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) { fprintf(stderr, "mysql_stmt_prepare() échoué : %s\n", mysql_stmt_error(stmt)); mysql_stmt_close(stmt); mysql_close(pMysql); return -1; } // Lier le paramètre (ville) MYSQL_BIND bind_param[1]; memset(bind_param, 0, sizeof(bind_param)); char ville[] = "Brétigny"; bind_param[0].buffer_type = MYSQL_TYPE_STRING; bind_param[0].buffer = ville; bind_param[0].buffer_length = strlen(ville); if (mysql_stmt_bind_param(stmt, bind_param) != 0) { fprintf(stderr, "mysql_stmt_bind_param() échoué : %s\n", mysql_stmt_error(stmt)); mysql_stmt_close(stmt); mysql_close(pMysql); return -1; } // Préparer les buffers de sortie MYSQL_BIND result_bind[2]; memset(result_bind, 0, sizeof(result_bind)); char fou_nom[100]; unsigned long fou_nom_length; my_bool fou_nom_is_null; char fou_ville[100]; unsigned long fou_ville_length; my_bool fou_ville_is_null; result_bind[0].buffer_type = MYSQL_TYPE_STRING; result_bind[0].buffer = fou_nom; result_bind[0].buffer_length = sizeof(fou_nom); result_bind[0].length = &fou_nom_length; result_bind[0].is_null = &fou_nom_is_null; result_bind[1].buffer_type = MYSQL_TYPE_STRING; result_bind[1].buffer = fou_ville; result_bind[1].buffer_length = sizeof(fou_ville); result_bind[1].length = &fou_ville_length; result_bind[1].is_null = &fou_ville_is_null; if (mysql_stmt_bind_result(stmt, result_bind) != 0) { fprintf(stderr, "mysql_stmt_bind_result() échoué : %s\n", mysql_stmt_error(stmt)); mysql_stmt_close(stmt); mysql_close(pMysql); return -1; } // Exécuter la requête if (mysql_stmt_execute(stmt) != 0) { fprintf(stderr, "mysql_stmt_execute() échoué : %s\n", mysql_stmt_error(stmt)); mysql_stmt_close(stmt); mysql_close(pMysql); return -1; } // Afficher les résultats printf("fou_nom\t\tfou_ville\n"); printf("-----------------------------\n"); while (mysql_stmt_fetch(stmt) == 0) { printf("%s\t\t%s\n", fou_nom_is_null ? "NULL" : fou_nom, fou_ville_is_null ? "NULL" : fou_ville ); } mysql_stmt_close(stmt); 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 fou_nom fou_ville ----------------------------- B Meubles Brétigny