暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

通过C语言访问MariaDB数据库

英卓比特 2021-07-20
1507

1.前言


我们知道MariaDB是一个开源的、可完全取代MySql的数据库产品,而开发一般的应用程序,一般都需要用到文件读写技术、网络技术和数据库技术等,对于程序员来说,能够熟练使用计算机程序对文件、网络和数据库进行操作非常重要,所以这篇文章记录了通过C语言访问MariaDB数据库的几个基本操作,方便后续使用查阅,也希望能够给需要了解这方面知识的朋友提供有效的帮助,对此我将非常荣幸。


2.环境准备


我们需要准备一个CentOS7 64位的操作系统,一般都是安装到VMware上,这样做安全方便,不会影响主机的其它功能。


3.代码编辑和编译


首先,我们简单引用一下MariaDB的结构,看看能否正常的编译。先编辑MariaDBTest.c文件,内容如下:



使用如下命令编译代码,发现提示找不到mysql.h头文件。

    gcc MariaDBTest.co 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.i686y

          等待安装完成之后,在/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位操作系统下编译通过,经验证,运行结果正确。



              文章转载自英卓比特,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论