摘 要
本文重點介紹了MySQL數(shù)據(jù)庫的數(shù)據(jù)操作,并研究了在C語言中操作MySQL數(shù)據(jù)庫的基本API,包括MySQL庫中表的基本定義和常見的數(shù)據(jù)庫操作如增刪改查、聯(lián)合查詢等。
【關(guān)鍵詞】C語言 數(shù)據(jù)庫 MySQL
1 引言
1.1 C語言
C語言產(chǎn)生于50年前,是一種常采用的高級程序語言。基于C語言的設(shè)計采用相對簡單的編譯器,提供低級訪問內(nèi)存與語言結(jié)構(gòu),能有效地將程序語言映射到機器指令,并提供各種運行支持。C語言常用于操作系統(tǒng)、編譯器、數(shù)據(jù)庫為代表的匯編語言編寫的應(yīng)用程序設(shè)計等。C語言基于其靈活、跨平臺、高效等特點,從微控制器嵌入到超級計算機開發(fā)等均被廣泛采用。
C程序的開發(fā)通常需要預(yù)編譯、編譯、鏈接、運行等階段。預(yù)編譯采用宏替換源碼;編譯過程將源碼翻譯成二進(jìn)制機器碼;鏈接過程將程序采用的靜態(tài)、動態(tài)庫進(jìn)行連接,生成二進(jìn)制可執(zhí)行程序,并在運行階段直接運行。
1.2 MySQL數(shù)據(jù)庫
現(xiàn)代常用的數(shù)據(jù)庫分為關(guān)系型數(shù)據(jù)庫、分布式數(shù)據(jù)庫以及NOSQL等幾種類型。目前的OLTP(On-Line Transaction Processing,即聯(lián)機數(shù)據(jù)處理過程)中多采用以MySQL為代表的關(guān)系型數(shù)據(jù)庫。
MySQL是一個由瑞典MySQLAB公司開發(fā)的開源的關(guān)系數(shù)據(jù)庫管理系統(tǒng)(RDBMS),采用通用的結(jié)構(gòu)化查詢語言(Structured Query Language),使用C與C++語言編寫,使用yacc SQL解析器。MySQL源代碼采用GNU通用公共許可證的條款(即開源條款),更受各國開發(fā)者的青睞。MySQL的數(shù)據(jù)操作執(zhí)行快速穩(wěn)定、開發(fā)接口豐富、開發(fā)文檔完善等,被廣泛應(yīng)用于以Web應(yīng)用為代表的程序開發(fā)與應(yīng)用。
2 數(shù)據(jù)庫相關(guān)操作
2.1 連接 MySQL
數(shù)據(jù)庫連接的命令為“ mysql -h 服務(wù)器Ip地址 -u 用戶名-p 密碼 ”。假設(shè)遠(yuǎn)程主機的IP 為:10.0.0.1,用戶名為root,密碼為psd。則需要輸入以下命令行:
mysql –h10.0.0.1 -uroot –ppsd
2.2 創(chuàng)建數(shù)據(jù)庫
數(shù)據(jù)庫的創(chuàng)建命令為(此處DBTest為數(shù)據(jù)庫名):
Create database DBTest;
顯示數(shù)據(jù)庫列表命令為(此處DBTest為數(shù)據(jù)庫名):
show databases DBTest;
使用數(shù)據(jù)庫命令為(此處DBTest為數(shù)據(jù)庫名):
use DBTest;
2.3 建立數(shù)據(jù)表
在當(dāng)前使用的數(shù)據(jù)庫建立數(shù)據(jù)表(此處teacher為表名):
create table teacher
( id varchar(10) not null primary key, //屬性名—ID、長度10的可變字符串型、不可為空、主鍵name varchar(10) not null, //屬性名—name、長度10的可變字符串 不可為空year date ); //屬性名-year 日期
3 C程序訪問MySQL數(shù)據(jù)庫
3.1 相關(guān)數(shù)據(jù)結(jié)構(gòu)定義
定義查詢命令的結(jié)構(gòu)體類型:
typedef struct st_mysql {
…
} MYSQL;
定義返回數(shù)據(jù)的結(jié)構(gòu)體類型:
typedef struct st_mysql_res {
…
} MYSQL_RES;
3.2 相關(guān)函數(shù)
C語言訪問MYSQL數(shù)據(jù)庫的相關(guān)函數(shù)如表1所示。
MYSQL *mysql_init(MYSQL *mysql) 初始化MYSQL實例
Void mysql_close(MYSQL *mysql) 關(guān)閉MYSQL實例,釋放內(nèi)存
Int mysql_query(MYSQL *mysql,const char *query) 對指定連接進(jìn)行查詢。成功返回0,出錯返回非0值
MYSQL_RES *musql_store_result(MYSQL *handle) 返回查詢的結(jié)果
MYSQL_ROW mysql_fetch_row(MYSQL_RES *res) 返回第一行查詢的結(jié)果
3.3 C語言訪問 MySQL 的程序?qū)嵗?/p>
#include
#include
#include
//定義數(shù)據(jù)庫查詢宏(此處根據(jù)參數(shù)userid查詢teacher表的name year屬性)
#define SELECT_QUERY "select name,year from teacher where userid = %d"
//main函數(shù),C語言執(zhí)行的入口
int main(int argc, char **argv) {
//定義使用的變量
//調(diào)用mysql_init方法,初始化連接實例
mysql_init(&mysql);
//向數(shù)據(jù)庫插入數(shù)據(jù)(insert操作),如遇異常則返回
res = mysql_query (&my_connection, "INSERT INTO teacher(name,year) VALUES(Ana, 1989)");
if (res)
fprintf (stderr, "Insert error %d: %s\n", mysql_errno (&my_connection), mysql_error(&my_connection));
}
//修改數(shù)據(jù)(update操作),如遇異常則返回
res = mysql_query (&my_connection, "update teacher set year= 1999 where name =Peter");
if (res)
fprintf (stderr, "Update error %d: %s\n", mysql_errno (&my_connection), mysql_error(&my_connection));
}
sprintf(buf,SELECT_QUERY,atoi(argv[1]));
//查詢數(shù)據(jù)行(select操作)
if(mysql_query(handle,buf)) {
fprintf(stderr,"Query failed (%s)\n",mysql_error(handle)); exit(1);
}
//緩存結(jié)果
If (! (result=mysql_store_result(handle))) {
fprintf(stderr,"Get result from %s failed\n", mysql_error (handle));
exit(1);
}
printf("number of fields returned: %d\n",mysql_num_fields (result));
query ok !
4 結(jié)語
用C語言訪問 MySQL 在實際 Web 應(yīng)用中并不多見,但是有時候為了獲取更高訪問性能,會直接用C語言來開發(fā)相關(guān)的數(shù)據(jù)庫訪問模塊,這樣可以更好地利用服務(wù)器的資源,并且使用C語言具有更好的安全性,所以用C語言訪問MySQL數(shù)據(jù)庫相比其他語言雖然在程序開發(fā)上成本高一些,但是具備更好的性能和安全性。
參考文獻(xiàn)
[1]吳垠,余瑾,郭磊等.MySQL數(shù)據(jù)庫在嵌入式Linux平臺上的移植和應(yīng)用[J].電子技術(shù),2011,38(07):12-13.
[2]趙洪明.MySQL中訪問數(shù)據(jù)庫的程序設(shè)計[J].黃石高等專科學(xué)校學(xué)報,2012,18(01):10-12.
[3]李達(dá).基于知識庫的高分辨率遙感影像分割系統(tǒng)的設(shè)計與實現(xiàn)[D].太原:山西大學(xué),2014.
作者簡介
張麗(1981-)女,漢族,山西省襄汾縣人。碩士學(xué)位。現(xiàn)為山西管理職業(yè)學(xué)院講師。主要研究方向為計算機語言。
作者單位
山西管理職業(yè)學(xué)院 山西省臨汾市 041000