基于C语言访问MySQL数据库的研究与实现
2017-07-06赵卫东周晓清刘永红叶安胜
鄢 涛, 赵卫东, 周晓清, 刘永红, 叶安胜, 余 悦
(1.成都大学 信息科学与工程学院, 四川 成都 610106;2.成都大学 模式识别与智能信息处理四川省高校重点实验室, 四川 成都 610106)
基于C语言访问MySQL数据库的研究与实现
鄢 涛1,2, 赵卫东1,2, 周晓清1,2, 刘永红1,2, 叶安胜1,2, 余 悦1
(1.成都大学 信息科学与工程学院, 四川 成都 610106;2.成都大学 模式识别与智能信息处理四川省高校重点实验室, 四川 成都 610106)
分析了在Windows平台下如何利用MySQL提供的驱动支持,通过配置VC和VS 2个常用IDE,最后实现C语言访问MySQL的规范和详尽的流程.该流程为C语言操作MySQL并进行应用程序开发提供了完美解决方案.
C语言;MySQL;VC;VS
0 引 言
C语言是一门通用计算机编程语言,因其灵活、跨平台与高效等特点,从微控制器嵌入到超级计算机开发等均被广泛采用[1].MySQL是一个开源的关系数据库管理系统(Relational Database Management,RDBMS),采用通用的结构化查询语言(Structured Query Language,SQL)进行数据管理,被广泛应用于以Web应用为代表的程序开发与应用,尤其是不需要事务化处理的场合[2-5].本研究讨论了在Windows环境下如何利用MySQL提供的支持文件,通过配置VC和VS,最后实现C语言访问MySQL的完美解决方案.
1 获取MySQL的驱动
1.1 安装和验证MySQL
MySQL软件可以直接到MySQL官方网站(https://www.mysql.com/downloads/)获取,也可以通过Orcale网站(https://www.oracle.org/downloads/)获取.其安装过程比较简单,本研究不做详细介绍,但有一点要特别强调:以MySQL5.0的安装过程为例,在“Choose Setup Type"(选择安装类型)时,需选择“Complete"(完全)安装方式(如果是MySQL 5.7,则选择Full选项),只有这样,才能获得需要的驱动.
需要说明的是,在尝试使用C语言访问MySQL之前,首先应该确保MySQL能被正确访问.验证方式通常有2种:命令行方式与使用可视化工具软件,如Navicat for MySQL等.
以命令行方式为例加以说明如下:打开Windows控制台窗口,在DOS提示符下输入命令(设当前路径为C盘根目录):
c:>mysql -h 服务器 -u 用户名 -p
Enter password:******
说明:h、u、p分别表示host(主机)、username(用户名)、password(密码);服务器为安装和提供MySQL服务的服务器IP地址,本机则为“localhost";用户名表示访问MySQL的账户;******表示账户相应的密码.
确定后,如果命令提示符变为“mysql>",则表示连接成功,程序可以正常访问MySQL(见图1).
图1 命令行方式测试MySQL连接
1.2 获取MySQL的驱动
JAVA、C#等编程语言之所以能够直接访问数据库,是因为Eclipse、VS等IDE中已经包含了对数据库的支持,代码中直接引用相关的驱动即可(JAVA中引用jar包,C#中引用名空间).同理,VC和VS不能直接操作MySQL数据的原因也正是在于2个IDE都没有提供相应的数据库驱动.因此,正确地获取MySQL驱动,是C语言操作数据库的前提.
MySQL对C语言的支持包括库文件(.lib)与头文件(.h)二部分,由于涉及到版本兼容性问题,所以二者并没有统一通用的标准驱动文件.要获得与要访问的MySQL相匹配的驱动,最简单、最直接的办法就是到MySQL的安装目录下去查找.前提是安装MySQL的过程中,在“Choose Setup Type"(选择安装类型)时,选择“Complete"(完全)安装方式.假设MySQL的安装目录为“C:Program FilesMySQLMySQL Server 5.0",这个文件夹下有若干个子文件夹,其中include和lib就是本研究所需要的(见图2).
图2 MySQL安装目录下的include和lib文件夹
2 配置开发环境
2.1 配置Visual C++ 6.0开放环境
首先,需要将include和lib文件夹配置到VC的安装目录下(设VC的安装目录为“C:Program FileVisual C++ 6.0"),那么,在该目录下有个VC98文件夹,进入该文件夹,可以看到ALT、bin、include、lib等若干文件夹.具体步骤为:其一,将前面获取到的驱动文件夹include中与mysql相关文件,全部复制到VC98include文件夹中;其二,将前面获取到的驱动文件夹lib中与mysql相关文件,全部复制到VC98lib文件夹中.为了简化操作,可将2个驱动文件夹中的文件分别全部复制到VC98下对应的include和lib中.
2.2 配置Visual Studio开发环境
VS的配置与VC基本相同,设VS安装目录为“C:Program FilesMicrosoft Visual Studio 12.0"(12.0对应VS 2013版本,其他版本对应不同的数字),那么该目录下也应该有VC文件夹.进入该文件夹,可以看到in、crt、include、lib等若干文件夹.同样地,将获取到的include和lib中的驱动文件分别全部复制到VC下对应的include和lib中即可.
3 编写C代码访问MySQL
3.1 驱动加载
驱动加载,即在程序中引用第三方库.
首先要做的就是在程序中加载驱动,在C语言代码的预处理处加入如下3行重要代码,
01 #include
02 #include ″mysql.h″
03 #pragma comment(lib,″libmysql.lib″)
第01行是对网络访问的支持,也可以直接使用头文件Windows.h;第02行是引入MySQL相关操作的头文件;第03行是非常重要的,其作用是将库libmysql.lib的搜索记录放置到目标文件中去.
如果不在代码中加入03行语句,也可以采用设置工程属性的方法来达到目的.
VC的设置方法是:工程→设置,在“Project Settings"对话框的“连接”选项卡中,将“libmysql.lib"添加“对象/库模块"文本框,用空格与已有库文件分开即可(见图3).
图3 VC中设置工程属性方法引入MySQL的库“libmysql.lib"
VS的设置方法是:项目→属性→配置属性→链接器→附加依赖项,加入“libmysql.lib”库即可(见图4).
图4 VS中设置工程属性方法引入MySQL的库“libmysql.lib"
3.2 建立连接
要访问并操作MySQL,需要如下一些信息:host(主机),database(数据库),username(用户名),password(密码),port(端口号,默认为3306).假设对应参数分别为:202.115.80.216,cinaction,cdu,cddx,3306,则C语言连接MySQL数据库的参考代码如下:
01 char host[] = ″202.115.80.216″;/*数据库服务器*/
02 char dbName[] = ″cinaction″;/*要访问的数据库名*/
03 const char uname[] = ″cdu″;/*用户名*/
04 const char pwd[] = ″cddx″;/*密码*/
05 unsigned int port = 3306;/*端口号*/
06 MYSQL*conn;/*数据库连接指针*/
07 conn = mysql-init((MYSQL*)0);/*初始化数据库连接*/
08 if (!conn)
09 printf(″MySQL init failed! ″);
10 else {
11 conn = mysql-real-connect(conn,host,uname,pwd, dbName,port,NULL,0);
12 if (conn)
13 printf(″Success! ″);
14 else
15 printf(″Connectioin failed! ″);
16 }
17 if (conn != NULL)
18 mysql-close(conn);
上述代码中,01~05行定义各个参数;06、07行声明并初始化MySQL连接对象,只有初始化成功,才能进行实际连接;实际连接(第11行)函数mysql-real-connect()的倒数第2个参数为unix连接方式(NULL表明不使用socket或管道机制),最后一个参数是客户端的一些标志及组合,经常设为0.
3.3 数据库操作
数据库操作有很多种,其中,对于数据表记录的增加、删除、修改与查询最为常用.这里以操作一个简单的学生信息表为例加以说明.设上述数据库cinaction中有数据表student,表结构及示例数据如表1所示.
表1 数据表student
创建student表的SQL语句为:
CREATE TABLE ′student′ (
′id′ varchar(15) NOT NULL,
′name′ varchar(12) NOT NULL,
′age′ int(11) default ′0′,
PRIMARY KEY (′id′)
) ENGINE=InnoDB DEFAULT CHARSET=gbk;
上述SQL语句创建一个数据表,有id、name及age 3个字段,缺省字符集为gbk(支持中文).如果实际运行中,在写入中文字符时仍然报错(可能提示“Data too long for column XX at row n",其中XX为要存储中文信息的列名,n为插入数据的行),那么可以在连接数据库完成之后且在处理数据之前增加对中文编码的支持,代码如下:
if (mysql-query(conn,″set names gbk;″)){
printf(″Set char-set failed. ″);
return;
}
代码位于程序的第13行处,即if (conn)与else之间.当conn条件成立后执行该代码.
下面分别就数据库的4种操作进行简单演示.
1)插入数据.假设要插入1条学生记录,其学号、姓名与年龄信息均已获取并存放在变量newID、newName、newAge中,则对应操作代码如下:
char sql[1000];/*存储SQL语句的变量*/
sprintf(sql,″insert into student values(′%s′,′%s′,%d)″, newID,newName,newAge);
if (mysql-query(conn,sql))
printf(″Insert failed. ″);
else
printf(″Insert succeed! ″);
如果要插入多条数据,只需要重复获取数据,组合成不同的插入语句,并执行即可.
2)删除操作.假设要删除学号为201510414101的学生信息,该学号通过控制台接收用户输入并存放到字符数组变量delID中,则代码如下:
sprintf(sql,″delete from student where id=′%s′″,delID);
执行过程类同插入数据操作.
3)修改操作.假设要将学号为theID的学生的年龄改为newAge(设2个变量均已接收并存储用户输入),则相应的SQL语句组合如下:
sprintf(sql,″update student set age=%d where id=′%s′″,newAge,theID);
执行过程类同插入数据操作.
4)查询(读取)操作.相比于前3种操作,查询操作最为复杂,因为除了执行查询语句外,还要对读取到的数据进行处理.假设要查询name字段中包含keyword关键字的学生id和name并显示出来,相应代码如下:
01 sprintf(sql,″select id,name from student where name like ′%%%s%%′″,keyword);
02 MYSQL-RES*res;/*存储MySQL结果集*/
03 MYSQL-ROW row;/*行变量*/
04 if (mysql-query(conn,sql)){
05 printf(″Select failed. ″);
06 }
07 else{
08 res = mysql-store-result(conn);/*获取查询结果集*/
09 int num = (int)mysql-num-rows(res);/*获取查询结果记录数*/
10 if (num>0){
11 printf(″共有 %d 个符合条件的学生: =========== ″,num);
12 printf(″学号姓名 ″);
13 printf(″--------------------- ″);
14 row = mysql-fetch-row(res);/*获取1行信息*/
15 while (row != NULL){
16 printf(″%-15s%-14s ″,row[0],row[1]);/*输出当前行信息*/
17 row = mysql-fetch-row(res);
18 }
19 printf(″--------------------- ″);
20 }
21 else
22 printf(″ 没有符合条件的学生信息 =========== ″);
23 mysql-free-result(res);
24 }
上述代码第01行动态生成SQL语句,其中“…name like ‘%%%s%%’”,前后连续的%%是C语言中的特殊用法,实际输出时表示1个%,假设中间的格式控制符%s对应的keyword为“子",则最后生成的SQL字符串为“…name like ‘%子%’”,在SQL中为模糊查询,表示查询name中包含“子"字的记录.第08行获取查询的结果集,存放到变量res中;第09行获取记录数;第11~19行输出结果记录,其中第14、17行的mysql-fetch-row(res)的作用是从记录集res中获取1行记录,同时指针向后移动1行;第23行释放记录集.
3.4 关闭连接
当数据库操作完成后,使用mysql-close(conn)关闭连接,释放资源.虽然已打开的非持久连接会在脚本执行完毕后自动关闭,可以不使用mysql-close(),但是及时主动释放资源是良好的习惯.
4 结 论
C语言是经典的程序设计语言,但C语言并未直接提供对数据库访问的支持,使得它在数据持久化方面的应用比较困难.本研究分析了在Windows平台下如何利用MySQL提供的驱动支持,通过配置VC和VS 2个常用IDE,最后实现C语言访问MySQL的规范和详尽的流程,该流程为C语言操作MySQL并进行应用程序开发提供了一个完美解决方案.
[1]叶安胜,鄢涛.C语言综合项目实战[M].北京:科学出版社,2016.
[2]唐林.一种基于C语言访问MySQL数据库的研究[J].电脑编程技巧与维护,2016,23(7):57-58.
[3]张丽.基于C语言访问的MySQL数据库[J].电子技术与软件工程,2016,5(22):165-166.
[4]赵洪明.MySQL中访问数据库的程序设计[J].湖北理工学院学报,2002,18(1):10-12.
[5]冯祖洪,李映姝.Linux下的数据库MYSQL访问技术[J].现代电子技术,2001,25(4):7-10.
Research on and Implementation of MySQL Accessing Based on C Programming Language
YANTao1,2,ZHAOWeidong1,2,ZHOUXiaoqing1,2,LIUYonghong1,2,YEAnsheng1,2,YUYue1
(1.School of Information Science and Engineering, Chengdu University, Chengdu 610106, China;2.Key Laboratory of Pattern Recognition and Intelligent Information Processing of Higher Education of Sichuan Province,Chengdu University, Chengdu 610106, China)
This paper analyzes how to make full use of the drive provided by MySQL,and how to obtain the norms and the detailed process of C programming language's access the MySQL through the configuration of two commonly used IDE,namely VC and VS.Practically,this process serves as a perfect solution for the operation of MySQL by C programming language and for the application development too.
C programming language;MySQL;VC;VS
1004-5422(2017)02-0161-04
2017-05-02.
四川省科技厅软科学研究计划(2017ZR0198)资助项目.
鄢 涛(1973 — ), 男, 硕士, 副教授, 从事计算机软件工程研究.
TP311.13;TP312
A