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
Insertion
Programme source
/** * @file insertEnCMysql.c * @brief * compilation: gcc -o insertEnCMysql insertEnCMysql.c `mariadb_config --cflags --libs` * exécution : ./insertEnCMysql -u <user> -p <password> * Ce programme insère des données dans la table fournisseur de la base de données meubleFournisseur. * Il utilise les fonctions de la bibliothèque MySQL C API pour se connecter à la base de données, */ #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]; const char *sql = "INSERT INTO fournisseur (fou_nom, fou_ville) VALUES (?, ?)"; 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; // Utilisateur de la base de données break; case 'p': password = optarg; // Mot de passe break; default: usage(argv[0]); // Afficher l'usage si un argument invalide est passé } } // Vérifier que tous les arguments nécessaires sont fournis 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; } /* Préparer la requête SQL */ stmt = mysql_stmt_init(pMysql); if (mysql_stmt_prepare(stmt, sql, strlen(sql)) != 0) { fprintf(stderr, "mysql_stmt_prepare() échoué : %s\n", mysql_error(pMysql)); mysql_close(pMysql); return -1; } /* Lier les paramètres */ memset(param, 0, sizeof(param)); param[0].buffer_type = MYSQL_TYPE_STRING; param[0].buffer = "B Meubles"; param[0].buffer_length = strlen(param[0].buffer); param[1].buffer_type = MYSQL_TYPE_STRING; param[1].buffer = "Brétigny"; param[1].buffer_length = strlen(param[1].buffer); if (mysql_stmt_bind_param(stmt, param) != 0) { fprintf(stderr, "mysql_stmt_bind_param() échoué : %s\n", mysql_error(pMysql)); 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_error(pMysql)); mysql_stmt_close(stmt); mysql_close(pMysql); return -1; } /* Fermer la requête préparée et la connexion à la base */ mysql_stmt_close(stmt); mysql_close(pMysql); printf("Insertion réussie dans la base de données.\n"); 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 mariadb_config --cflags --libs
fournit les informations nécessaires à la compilation.
Remarque : il peut être nécessaire de remplacer mariadb_config
par mysql_config
adminX@serveurWebX:~$ gcc -o insertEnCMysql insertEnCMysql.c `mariadb_config --cflags --libs`
Exécution
adminX@serveurWebX:~$ ./insertEnCMysql Usage: ./insertEnCMysql -u-p adminX@serveurWebX:~$ ./insertEnCMysql -u adminBasemeuble1 Usage: ./insertEnCMysql -u -p adminX@serveurWebX:~$ ./insertEnCMysql -u adminBaseMeuble1 -p bonjour Insertion réussie dans la base de données.
Vérification
adminX@serveurWebX:~$ mysql -u adminBaseMeuble1 -p meubleFournisseur Enter password: mysql> SELECT * from fournisseur; +--------+-----------+-----------+ | fou_id | fou_nom | fou_ville | +--------+-----------+-----------+ | 1 | A Meubles | Arpajon | | 2 | E Meubles | Etampes | | 3 | D Meubles | Dourdan | | 7 | B Meubles | Brétigny | +--------+-----------+-----------+