鄢 濤, 趙衛東, 周曉清, 劉永紅, 葉安勝, 余 悅
(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
C語言是一門通用計算機編程語言,因其靈活、跨平臺與高效等特點,從微控制器嵌入到超級計算機開發等均被廣泛采用[1].MySQL是一個開源的關系數據庫管理系統(Relational Database Management,RDBMS),采用通用的結構化查詢語言(Structured Query Language,SQL)進行數據管理,被廣泛應用于以Web應用為代表的程序開發與應用,尤其是不需要事務化處理的場合[2-5].本研究討論了在Windows環境下如何利用MySQL提供的支持文件,通過配置VC和VS,最后實現C語言訪問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.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.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(),但是及時主動釋放資源是良好的習慣.
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