鄢 濤, 趙衛(wèi)東, 周曉清, 劉永紅, 葉安勝, 余 悅
(1.成都大學(xué) 信息科學(xué)與工程學(xué)院, 四川 成都 610106;2.成都大學(xué) 模式識別與智能信息處理四川省高校重點(diǎn)實(shí)驗(yàn)室, 四川 成都 610106)
?
基于C語言訪問MySQL數(shù)據(jù)庫的研究與實(shí)現(xiàn)
鄢 濤1,2, 趙衛(wèi)東1,2, 周曉清1,2, 劉永紅1,2, 葉安勝1,2, 余 悅1
(1.成都大學(xué) 信息科學(xué)與工程學(xué)院, 四川 成都 610106;2.成都大學(xué) 模式識別與智能信息處理四川省高校重點(diǎn)實(shí)驗(yàn)室, 四川 成都 610106)
分析了在Windows平臺下如何利用MySQL提供的驅(qū)動支持,通過配置VC和VS 2個常用IDE,最后實(shí)現(xiàn)C語言訪問MySQL的規(guī)范和詳盡的流程.該流程為C語言操作MySQL并進(jìn)行應(yīng)用程序開發(fā)提供了完美解決方案.
C語言;MySQL;VC;VS
C語言是一門通用計(jì)算機(jī)編程語言,因其靈活、跨平臺與高效等特點(diǎn),從微控制器嵌入到超級計(jì)算機(jī)開發(fā)等均被廣泛采用[1].MySQL是一個開源的關(guān)系數(shù)據(jù)庫管理系統(tǒng)(Relational Database Management,RDBMS),采用通用的結(jié)構(gòu)化查詢語言(Structured Query Language,SQL)進(jìn)行數(shù)據(jù)管理,被廣泛應(yīng)用于以Web應(yīng)用為代表的程序開發(fā)與應(yīng)用,尤其是不需要事務(wù)化處理的場合[2-5].本研究討論了在Windows環(huán)境下如何利用MySQL提供的支持文件,通過配置VC和VS,最后實(shí)現(xiàn)C語言訪問MySQL的完美解決方案.
1.1 安裝和驗(yàn)證MySQL
MySQL軟件可以直接到MySQL官方網(wǎng)站(https://www.mysql.com/downloads/)獲取,也可以通過Orcale網(wǎng)站(https://www.oracle.org/downloads/)獲取.其安裝過程比較簡單,本研究不做詳細(xì)介紹,但有一點(diǎn)要特別強(qiáng)調(diào):以MySQL5.0的安裝過程為例,在“Choose Setup Type"(選擇安裝類型)時,需選擇“Complete"(完全)安裝方式(如果是MySQL 5.7,則選擇Full選項(xiàng)),只有這樣,才能獲得需要的驅(qū)動.
需要說明的是,在嘗試使用C語言訪問MySQL之前,首先應(yīng)該確保MySQL能被正確訪問.驗(yàn)證方式通常有2種:命令行方式與使用可視化工具軟件,如Navicat for MySQL等.
以命令行方式為例加以說明如下:打開Windows控制臺窗口,在DOS提示符下輸入命令(設(shè)當(dāng)前路徑為C盤根目錄):
c:>mysql -h 服務(wù)器 -u 用戶名 -p
Enter password:******
說明:h、u、p分別表示host(主機(jī))、username(用戶名)、password(密碼);服務(wù)器為安裝和提供MySQL服務(wù)的服務(wù)器IP地址,本機(jī)則為“l(fā)ocalhost";用戶名表示訪問MySQL的賬戶;******表示賬戶相應(yīng)的密碼.
確定后,如果命令提示符變?yōu)椤癿ysql>",則表示連接成功,程序可以正常訪問MySQL(見圖1).

圖1 命令行方式測試MySQL連接
1.2 獲取MySQL的驅(qū)動
JAVA、C#等編程語言之所以能夠直接訪問數(shù)據(jù)庫,是因?yàn)镋clipse、VS等IDE中已經(jīng)包含了對數(shù)據(jù)庫的支持,代碼中直接引用相關(guān)的驅(qū)動即可(JAVA中引用jar包,C#中引用名空間).同理,VC和VS不能直接操作MySQL數(shù)據(jù)的原因也正是在于2個IDE都沒有提供相應(yīng)的數(shù)據(jù)庫驅(qū)動.因此,正確地獲取MySQL驅(qū)動,是C語言操作數(shù)據(jù)庫的前提.
MySQL對C語言的支持包括庫文件(.lib)與頭文件(.h)二部分,由于涉及到版本兼容性問題,所以二者并沒有統(tǒng)一通用的標(biāo)準(zhǔn)驅(qū)動文件.要獲得與要訪問的MySQL相匹配的驅(qū)動,最簡單、最直接的辦法就是到MySQL的安裝目錄下去查找.前提是安裝MySQL的過程中,在“Choose Setup Type"(選擇安裝類型)時,選擇“Complete"(完全)安裝方式.假設(shè)MySQL的安裝目錄為“C:Program FilesMySQLMySQL Server 5.0",這個文件夾下有若干個子文件夾,其中include和lib就是本研究所需要的(見圖2).

圖2 MySQL安裝目錄下的include和lib文件夾
2.1 配置Visual C++ 6.0開放環(huán)境
首先,需要將include和lib文件夾配置到VC的安裝目錄下(設(shè)VC的安裝目錄為“C:Program FileVisual C++ 6.0"),那么,在該目錄下有個VC98文件夾,進(jìn)入該文件夾,可以看到ALT、bin、include、lib等若干文件夾.具體步驟為:其一,將前面獲取到的驅(qū)動文件夾include中與mysql相關(guān)文件,全部復(fù)制到VC98include文件夾中;其二,將前面獲取到的驅(qū)動文件夾lib中與mysql相關(guān)文件,全部復(fù)制到VC98lib文件夾中.為了簡化操作,可將2個驅(qū)動文件夾中的文件分別全部復(fù)制到VC98下對應(yīng)的include和lib中.
2.2 配置Visual Studio開發(fā)環(huán)境
VS的配置與VC基本相同,設(shè)VS安裝目錄為“C:Program FilesMicrosoft Visual Studio 12.0"(12.0對應(yīng)VS 2013版本,其他版本對應(yīng)不同的數(shù)字),那么該目錄下也應(yīng)該有VC文件夾.進(jìn)入該文件夾,可以看到in、crt、include、lib等若干文件夾.同樣地,將獲取到的include和lib中的驅(qū)動文件分別全部復(fù)制到VC下對應(yīng)的include和lib中即可.
3.1 驅(qū)動加載
驅(qū)動加載,即在程序中引用第三方庫.
首先要做的就是在程序中加載驅(qū)動,在C語言代碼的預(yù)處理處加入如下3行重要代碼,
01 #include
02 #include ″mysql.h″
03 #pragma comment(lib,″libmysql.lib″)
第01行是對網(wǎng)絡(luò)訪問的支持,也可以直接使用頭文件Windows.h;第02行是引入MySQL相關(guān)操作的頭文件;第03行是非常重要的,其作用是將庫libmysql.lib的搜索記錄放置到目標(biāo)文件中去.
如果不在代碼中加入03行語句,也可以采用設(shè)置工程屬性的方法來達(dá)到目的.
VC的設(shè)置方法是:工程→設(shè)置,在“Project Settings"對話框的“連接”選項(xiàng)卡中,將“l(fā)ibmysql.lib"添加“對象/庫模塊"文本框,用空格與已有庫文件分開即可(見圖3).

圖3 VC中設(shè)置工程屬性方法引入MySQL的庫“l(fā)ibmysql.lib"
VS的設(shè)置方法是:項(xiàng)目→屬性→配置屬性→鏈接器→附加依賴項(xiàng),加入“l(fā)ibmysql.lib”庫即可(見圖4).

圖4 VS中設(shè)置工程屬性方法引入MySQL的庫“l(fā)ibmysql.lib"
3.2 建立連接
要訪問并操作MySQL,需要如下一些信息:host(主機(jī)),database(數(shù)據(jù)庫),username(用戶名),password(密碼),port(端口號,默認(rèn)為3306).假設(shè)對應(yīng)參數(shù)分別為:202.115.80.216,cinaction,cdu,cddx,3306,則C語言連接MySQL數(shù)據(jù)庫的參考代碼如下:
01 char host[] = ″202.115.80.216″;/*數(shù)據(jù)庫服務(wù)器*/
02 char dbName[] = ″cinaction″;/*要訪問的數(shù)據(jù)庫名*/
03 const char uname[] = ″cdu″;/*用戶名*/
04 const char pwd[] = ″cddx″;/*密碼*/
05 unsigned int port = 3306;/*端口號*/
06 MYSQL*conn;/*數(shù)據(jù)庫連接指針*/
07 conn = mysql-init((MYSQL*)0);/*初始化數(shù)據(jù)庫連接*/
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行定義各個參數(shù);06、07行聲明并初始化MySQL連接對象,只有初始化成功,才能進(jìn)行實(shí)際連接;實(shí)際連接(第11行)函數(shù)mysql-real-connect()的倒數(shù)第2個參數(shù)為unix連接方式(NULL表明不使用socket或管道機(jī)制),最后一個參數(shù)是客戶端的一些標(biāo)志及組合,經(jīng)常設(shè)為0.
3.3 數(shù)據(jù)庫操作
數(shù)據(jù)庫操作有很多種,其中,對于數(shù)據(jù)表記錄的增加、刪除、修改與查詢最為常用.這里以操作一個簡單的學(xué)生信息表為例加以說明.設(shè)上述數(shù)據(jù)庫cinaction中有數(shù)據(jù)表student,表結(jié)構(gòu)及示例數(shù)據(jù)如表1所示.

表1 數(shù)據(jù)表student
創(chuàng)建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語句創(chuàng)建一個數(shù)據(jù)表,有id、name及age 3個字段,缺省字符集為gbk(支持中文).如果實(shí)際運(yùn)行中,在寫入中文字符時仍然報(bào)錯(可能提示“Data too long for column XX at row n",其中XX為要存儲中文信息的列名,n為插入數(shù)據(jù)的行),那么可以在連接數(shù)據(jù)庫完成之后且在處理數(shù)據(jù)之前增加對中文編碼的支持,代碼如下:
if (mysql-query(conn,″set names gbk;″)){
printf(″Set char-set failed. ″);
return;
}
代碼位于程序的第13行處,即if (conn)與else之間.當(dāng)conn條件成立后執(zhí)行該代碼.
下面分別就數(shù)據(jù)庫的4種操作進(jìn)行簡單演示.
1)插入數(shù)據(jù).假設(shè)要插入1條學(xué)生記錄,其學(xué)號、姓名與年齡信息均已獲取并存放在變量newID、newName、newAge中,則對應(yīng)操作代碼如下:
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! ″);
如果要插入多條數(shù)據(jù),只需要重復(fù)獲取數(shù)據(jù),組合成不同的插入語句,并執(zhí)行即可.
2)刪除操作.假設(shè)要刪除學(xué)號為201510414101的學(xué)生信息,該學(xué)號通過控制臺接收用戶輸入并存放到字符數(shù)組變量delID中,則代碼如下:
sprintf(sql,″delete from student where id=′%s′″,delID);
執(zhí)行過程類同插入數(shù)據(jù)操作.
3)修改操作.假設(shè)要將學(xué)號為theID的學(xué)生的年齡改為newAge(設(shè)2個變量均已接收并存儲用戶輸入),則相應(yīng)的SQL語句組合如下:
sprintf(sql,″update student set age=%d where id=′%s′″,newAge,theID);
執(zhí)行過程類同插入數(shù)據(jù)操作.
4)查詢(讀取)操作.相比于前3種操作,查詢操作最為復(fù)雜,因?yàn)槌藞?zhí)行查詢語句外,還要對讀取到的數(shù)據(jù)進(jìn)行處理.假設(shè)要查詢name字段中包含keyword關(guān)鍵字的學(xué)生id和name并顯示出來,相應(yīng)代碼如下:
01 sprintf(sql,″select id,name from student where name like ′%%%s%%′″,keyword);
02 MYSQL-RES*res;/*存儲MySQL結(jié)果集*/
03 MYSQL-ROW row;/*行變量*/
04 if (mysql-query(conn,sql)){
05 printf(″Select failed. ″);
06 }
07 else{
08 res = mysql-store-result(conn);/*獲取查詢結(jié)果集*/
09 int num = (int)mysql-num-rows(res);/*獲取查詢結(jié)果記錄數(shù)*/
10 if (num>0){
11 printf(″共有 %d 個符合條件的學(xué)生: =========== ″,num);
12 printf(″學(xué)號姓名 ″);
13 printf(″--------------------- ″);
14 row = mysql-fetch-row(res);/*獲取1行信息*/
15 while (row != NULL){
16 printf(″%-15s%-14s ″,row[0],row[1]);/*輸出當(dāng)前行信息*/
17 row = mysql-fetch-row(res);
18 }
19 printf(″--------------------- ″);
20 }
21 else
22 printf(″ 沒有符合條件的學(xué)生信息 =========== ″);
23 mysql-free-result(res);
24 }
上述代碼第01行動態(tài)生成SQL語句,其中“…name like ‘%%%s%%’”,前后連續(xù)的%%是C語言中的特殊用法,實(shí)際輸出時表示1個%,假設(shè)中間的格式控制符%s對應(yīng)的keyword為“子",則最后生成的SQL字符串為“…name like ‘%子%’”,在SQL中為模糊查詢,表示查詢name中包含“子"字的記錄.第08行獲取查詢的結(jié)果集,存放到變量res中;第09行獲取記錄數(shù);第11~19行輸出結(jié)果記錄,其中第14、17行的mysql-fetch-row(res)的作用是從記錄集res中獲取1行記錄,同時指針向后移動1行;第23行釋放記錄集.
3.4 關(guān)閉連接
當(dāng)數(shù)據(jù)庫操作完成后,使用mysql-close(conn)關(guān)閉連接,釋放資源.雖然已打開的非持久連接會在腳本執(zhí)行完畢后自動關(guān)閉,可以不使用mysql-close(),但是及時主動釋放資源是良好的習(xí)慣.
C語言是經(jīng)典的程序設(shè)計(jì)語言,但C語言并未直接提供對數(shù)據(jù)庫訪問的支持,使得它在數(shù)據(jù)持久化方面的應(yīng)用比較困難.本研究分析了在Windows平臺下如何利用MySQL提供的驅(qū)動支持,通過配置VC和VS 2個常用IDE,最后實(shí)現(xiàn)C語言訪問MySQL的規(guī)范和詳盡的流程,該流程為C語言操作MySQL并進(jìn)行應(yīng)用程序開發(fā)提供了一個完美解決方案.
[1]葉安勝,鄢濤.C語言綜合項(xiàng)目實(shí)戰(zhàn)[M].北京:科學(xué)出版社,2016.
[2]唐林.一種基于C語言訪問MySQL數(shù)據(jù)庫的研究[J].電腦編程技巧與維護(hù),2016,23(7):57-58.
[3]張麗.基于C語言訪問的MySQL數(shù)據(jù)庫[J].電子技術(shù)與軟件工程,2016,5(22):165-166.
[4]趙洪明.MySQL中訪問數(shù)據(jù)庫的程序設(shè)計(jì)[J].湖北理工學(xué)院學(xué)報(bào),2002,18(1):10-12.
[5]馮祖洪,李映姝.Linux下的數(shù)據(jù)庫MYSQL訪問技術(shù)[J].現(xiàn)代電子技術(shù),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.
四川省科技廳軟科學(xué)研究計(jì)劃(2017ZR0198)資助項(xiàng)目.
鄢 濤(1973 — ), 男, 碩士, 副教授, 從事計(jì)算機(jī)軟件工程研究.
TP311.13;TP312
A