1.前言
我们知道MariaDB是一个开源的、可完全取代MySql的数据库产品,而开发一般的应用程序,一般都需要用到文件读写技术、网络技术和数据库技术等,对于程序员来说,能够熟练使用计算机程序对文件、网络和数据库进行操作非常重要,所以这篇文章记录了通过C语言访问MariaDB数据库的几个基本操作,方便后续使用查阅,也希望能够给需要了解这方面知识的朋友提供有效的帮助,对此我将非常荣幸。
2.环境准备
我们需要准备一个CentOS7 64位的操作系统,一般都是安装到VMware上,这样做安全方便,不会影响主机的其它功能。
3.代码编辑和编译
首先,我们简单引用一下MariaDB的结构,看看能否正常的编译。先编辑MariaDBTest.c文件,内容如下:

使用如下命令编译代码,发现提示找不到mysql.h头文件。
gcc MariaDBTest.c –o MariaDBTest
编译结果如下所示:

根据Linux系统默认的文件路径,一般引用库的头文件会放在/usr/include/目录下,应用库的库文件会放在/usr/lib64/目录下(32位系统在lib目录),因此我们先到这两个目录下查找一下,有没有mysql相关的文件。
先切换到/usr/include/目录,使用如下命令查找:
ll | grep mysql
未能找到任何文件或文件夹。
其实是我们的系统中没有安装MariaDB的开发包,我们可以通过如下命令来查找MariaDB相关的安装包。
yum search mariadb
查找结果如下所示:

发现mariadb-devel.i686是MariaDB应用程序的开发文件对应的安装包,于是执行如下命令进行安装:
yum mariadb-devel.i686 –y
等待安装完成之后,在/usr/include/目录下发现了一个mysql文件夹,该文件夹下是MariaDB应用程序开发相关的一系列头文件。此时,我们再次回到我们的测试代码目录进行编译,发现依然提示找不到mysql.h头文件。使用vim对MariaDBTest.c文件进行编辑,将#include <mysql.h>改为#include <mysql/mysql.h>后编译,解决了找不到mysql.h头文件的问题,但提示有未定义的引用,编译结果如下所示:

判断这个错误应该是链接问题,虽然在代码中包含了需要使用的头文件,但是在编译时并没有提供库的链接。关于gcc编译的详细方法,可以参考《GCC编译过程与动态链接库和静态链接库》,此处不再赘述,直接给出如下编译命令进行编译。
gcc –L usr/lib64/mysql/ -lmysqlclient MariaDBTest.c –o MariaDBTest
编译完成。
到此,引用和链接MariaDB SDK的基本方法已经找到。
下面按照如下功能点继续完善代码:
1,创建一个t_user数据表,该数据表包含自增的ID,用户名,密码,创建时间和备注共5列;
2,向t_user数据表中插入记录;
3,修改t_user数据表中用户的密码和备注;
4,删除t_user数据表中的记录。
MariaDBTest.c完整代码如下:
/************************************** This is a MariaDB access example. ** File name: MariaDBTest.c ** Author : Tim Wang ** Date : 2019.12.22 ***************************************/#include <stdio.h>#include <string.h>#include <mysql/mysql.h>void CreateTable(MYSQL *mysql){int flag;char* sql;sql = "CREATE TABLE t_user(ID INT NOT NULL AUTO_INCREMENT, \name VARCHAR(64) NOT NULL, \password VARCHAR(32) NOT NULL, \create_time TIMESTAMP, \other VARCHAR(128), \PRIMARY KEY ( ID ) \)ENGINE=InnoDB DEFAULT CHARSET=utf8;";flag = mysql_real_query(mysql, sql, (unsigned int)strlen(sql));if(flag){printf("Create table failure!\n");}else{printf("Create table success!\n");}}void InsertUser(MYSQL *mysql){int flag;char* sql;char name[64] = {0};char password[32] = {0};char other[128] = {0};char buf[256];printf("Please input user name:");scanf("%s", name);printf("Please input user password:");scanf("%s", password);printf("Please input other thing about user:");scanf("%s", other);sql = "INSERT INTO t_user(name, password, create_time, other) \VALUES('%s', '%s', NOW(), '%s');";sprintf(buf, sql, name, password, other);flag = mysql_real_query(mysql, buf, (unsigned int)strlen(buf));if(flag){printf("Insert user failure!\n");}else{printf("Insert user success!\n");}}void ModifyUser(MYSQL *mysql){int flag;char* sql;char name[64] = {0};char password[32] = {0};char other[128] = {0};char buf[256];printf("Please input the user name who will be modified:");scanf("%s", name);printf("Please input user password:");scanf("%s", password);printf("Please input other thing about user:");scanf("%s", other);sql = "UPDATE t_user SET password='%s', other='%s' WHERE name='%s';";sprintf(buf, sql, password, other, name);printf(buf);printf("\n");flag = mysql_real_query(mysql, buf, (unsigned int)strlen(buf));if(flag){printf("Modify user failure!\n");}else{printf("Modify user success!\n");}}void DeleteUser(MYSQL *mysql){int flag;char* sql;char name[64] = {0};char buf[256];printf("Please input the user name who will be deleted:");scanf("%s", name);printf("Please input user password:");sql = "DELETE FROM t_user WHERE name='%s';";sprintf(buf, sql, name);flag = mysql_real_query(mysql, buf, (unsigned int)strlen(buf));if(flag){printf("Delete user failure!\n");}else{printf("Delete user success!\n");}}void ShowUsers(MYSQL *mysql){int flag, t;char* sql;MYSQL_RES *res;MYSQL_ROW row;sql = "SELECT * FROM t_user";flag = mysql_real_query(mysql, sql, (unsigned int)strlen(sql));if(flag){printf("Query failed!\n");}else{printf("[%s] made...\n", sql);}/*mysql_store_result will read all result*/res = mysql_store_result(mysql);/*mysql_fetch_row get next row of the result*/while(row = mysql_fetch_row(res)){/*mysql_num_fields return fields number of the result*/for(t = 0; t < mysql_num_fields(res); t++){printf("%s\t", row[t]);}printf("\n");}}int main(){int nCmd = 1;MYSQL *mysql;mysql = mysql_init(NULL);if(!mysql_real_connect( mysql,"localhost","tim","123456","mydatabase",0,NULL,0) ){fprintf( stderr,"Connect Failed,Error:%s\n",mysql_error(mysql) );}while((nCmd >= 1) && (nCmd <= 4)){printf("Please input:\n1,Create table;\n2,Insert data;\n3,Modify data;\n4,Delete data;\nOther single number,Quit.\n");scanf("%d",&nCmd);if((nCmd < 0) && (nCmd > 9))continue;switch(nCmd){case 1:CreateTable(mysql);break;case 2:InsertUser(mysql);ShowUsers(mysql);break;case 3:ShowUsers(mysql);ModifyUser(mysql);ShowUsers(mysql);break;case 4:ShowUsers(mysql);DeleteUser(mysql);ShowUsers(mysql);break;default:break;}}mysql_close(mysql);return 0;}
下面是程序的运行结果:

4.小结
本文介绍了使用C语言通过调用MariaDB的库函数,进行数据库基本操作的方法。在文章最后附上了完整的C语言代码,该代码在CentOS7 64位操作系统下编译通过,经验证,运行结果正确。




