Mysql C API編程:用C語言編寫的Mysql編程接口
軟件開發(fā)中我們經(jīng)常要訪問數(shù)據(jù)庫,存取數(shù)據(jù),之前已經(jīng)有網(wǎng)友提出讓雞啄米講講數(shù)據(jù)庫編程的知識(shí),本文就詳細(xì)講解如何使用Mysql的C語言API進(jìn)行數(shù)據(jù)庫編程。
API,全稱Application Programming Interfaces,即應(yīng)用程序編程接口,我們可以調(diào)用這些接口,執(zhí)行API函數(shù)提供的功能。
Mysql C語言API就是用C語言編寫的Mysql編程接口,使用這些接口函數(shù)可以實(shí)現(xiàn)對(duì)Mysql數(shù)據(jù)庫的查詢等操作。
Mysql的安裝
要進(jìn)行Mysql編程首先要在充當(dāng)Mysql服務(wù)器的電腦和本機(jī)上都安裝Mysql,服務(wù)器上的Mysql用來連接查詢,本機(jī)上的Mysql作為開發(fā)之用,當(dāng)然本機(jī)也可以兼顧服務(wù)器和開發(fā)之用。下載Mysql可以到http://www.mysql.com/downloads/mysql/。雞啄米安裝的是“Windows (x86, 64-bit), MSI Installer”版本。
在Mysql安裝過程中,安裝選項(xiàng)一定要選上Development Components下的Client C API library(shared),這樣才會(huì)將Mysql API的頭文件和動(dòng)態(tài)庫安裝到電腦中。
安裝完成后,我們編程要用的就是include目錄下的頭文件和lib目錄下的庫文件。
Mysql API數(shù)據(jù)結(jié)構(gòu)
Mysql API中用到了很多結(jié)構(gòu)體等數(shù)據(jù)類型,下面就簡單說說常用的幾個(gè)數(shù)據(jù)結(jié)構(gòu)的含義,至于它們的定義雞啄米就不貼了,大家可以到Mysql提供的mysql.h頭文件中查看。
MYSQL
連接數(shù)據(jù)庫前,必須先創(chuàng)建MYSQL變量,此變量在很多Mysql API函數(shù)會(huì)用到。它包含了一些連接信息等數(shù)據(jù)。
MYSQL_RES
MYSQL_RES結(jié)構(gòu)體中包含了查詢結(jié)果集,也就是從數(shù)據(jù)庫中查詢到的數(shù)據(jù)。可以使用mysql_store_result或mysql_use_result函數(shù)獲得。
MYSQL_ROW
MYSQL ROW的定義如下:
typedef char **MYSQL_ROW;
可見,它實(shí)際上是char **類型,指向一個(gè)字符串?dāng)?shù)組。可以通過mysql_fetch_row函數(shù)獲得。
MYSQL_FIELD
MYSQL_FIELD中包含了字段名、字段類型和大小等信息。可以重復(fù)調(diào)用mysql_fetch_field函數(shù)獲得所有字段的信息。
Mysql C API編程步驟
1、首先我們要包含mysql的頭文件,并鏈接mysql動(dòng)態(tài)庫。即添加以下語句:
#include <WinSock2.h> // 進(jìn)行網(wǎng)絡(luò)編程需要winsock2.h
#include <mysql.h>
#pragma comment(lib, “l(fā)ibmysql.lib”)
2、創(chuàng)建MYSQL變量。如:
MYSQL mysql;
3、初始化MYSQL變量。
mysql_init(&mysql);
4、調(diào)用mysql_real_connect函數(shù)連接Mysql數(shù)據(jù)庫。mysql_real_connect函數(shù)的原型如下:
MYSQL * STDCALL mysql_real_connect(MYSQL *mysql, const char *host,const char *user,const char *passwd,const char *db,unsigned int port,const char *unix_socket,unsigned long clientflag);
參數(shù)說明:mysql--前面定義的MYSQL變量;host--MYSQL服務(wù)器的地址;user--登錄用戶名;passwd--登錄密碼;db--要連接的數(shù)據(jù)庫;port--MYSQL服務(wù)器的TCP服務(wù)端口;unix_socket--unix連接方式,為NULL時(shí)表示不使用socket或管道機(jī)制;clientflag--Mysql運(yùn)行為ODBC數(shù)據(jù)庫的標(biāo)記,一般取0。連接失敗時(shí)該函數(shù)返回0。
5、調(diào)用mysql_real_query函數(shù)進(jìn)行數(shù)據(jù)庫查詢。mysql_real_query函數(shù)的原型如下:
int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);
參數(shù)說明:mysql--前面定義的MYSQL變量;q--SQL查詢語句;length--查詢語句的長度。
查詢成功則該函數(shù)返回0。
6、通過調(diào)用mysql_store_result或mysql_use_result函數(shù)返回的MYSQL_RES變量獲取查詢結(jié)果數(shù)據(jù)。
兩個(gè)函數(shù)的原型分別為:
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
MYSQL_RES * STDCALL mysql_use_result(MYSQL *mysql);
這兩個(gè)函數(shù)分別代表了獲取查詢結(jié)果的兩種方式。第一種,調(diào)用mysql_store_result函數(shù)將從Mysql服務(wù)器查詢的所有數(shù)據(jù)都存儲(chǔ)到客戶端,然后讀取;第二種,調(diào)用mysql_use_result初始化檢索,以便于后面一行一行的讀取結(jié)果集,而它本身并沒有從服務(wù)器讀取任何數(shù)據(jù),這種方式較之第一種速度更快且所需內(nèi)存更少,但它會(huì)綁定服務(wù)器,阻止其他線程更新任何表,而且必須重復(fù)執(zhí)行mysql_fetch_row讀取數(shù)據(jù),直至返回NULL,否則未讀取的行會(huì)在下一次查詢時(shí)作為結(jié)果的一部分返回,故經(jīng)常我們使用mysql_store_result。
7、調(diào)用mysql_fetch_row函數(shù)讀取結(jié)果集數(shù)據(jù)。
上述兩種方式最后都是重復(fù)調(diào)用mysql_fetch_row函數(shù)讀取數(shù)據(jù)。mysql_fetch_row函數(shù)的原型如下:
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
參數(shù)result就是mysql_store_result或mysql_use_result的返回值。
該函數(shù)返回MYSQL_ROW型的變量,即字符串?dāng)?shù)組,假設(shè)為row,則row[i]為第i個(gè)字段的值。當(dāng)?shù)浇Y(jié)果集尾部時(shí),此函數(shù)返回NULL。
8、結(jié)果集用完后,調(diào)用mysql_free_result函數(shù)釋放結(jié)果集,以防內(nèi)存泄露。mysql_free_result函數(shù)的原型如下:
void STDCALL mysql_free_result(MYSQL_RES *result);
9、不再查詢Mysql數(shù)據(jù)庫時(shí),調(diào)用mysql_close函數(shù)關(guān)閉數(shù)據(jù)庫連接。mysql_close函數(shù)的原型為:
void STDCALL mysql_close(MYSQL *sock);
Mysql C API編程實(shí)例
這里給大家一個(gè)簡單的Mysql API編程實(shí)例。使用VS2010編寫。訪問的數(shù)據(jù)庫為安裝Mysql后默認(rèn)創(chuàng)建的名稱為“mysql”的數(shù)據(jù)庫,查詢其“user”表的數(shù)據(jù),步驟如下:
1、創(chuàng)建一個(gè)Win32 Console Application(Win32控制臺(tái)程序)的空工程(創(chuàng)建空工程需要在向?qū)У腁pplication Settings一步中,勾選Empty project),名稱就取為mysql。
2、在Solution Explorer窗口的工程名“mysql”上點(diǎn)右鍵,選擇“Properties”,彈出工程的屬性頁,然后在左側(cè)子窗口中,選擇Configuration Properties->VC++ Directories,右側(cè)子窗口中會(huì)顯示一些設(shè)置項(xiàng)列表,然后在Include Directories項(xiàng)中添加Mysql的Include目錄,在Library Directories項(xiàng)中添加Mysql的lib目錄。
3、新建一個(gè)cpp文件,取名mysql.cpp。
4、在mysql.cpp文件中包含mysql頭文件并鏈接mysql動(dòng)態(tài)庫。
#include <WinSock2.h>
#include <mysql.h>
#pragma comment(lib, “l(fā)ibmysql.lib”)
這里要注意,因?yàn)閙ysql用到了網(wǎng)絡(luò)連接的接口函數(shù),所以需要在前面包含WinSock2.h文件。
同時(shí)本例中使用了輸出流cout,所以還要包含輸入輸出流頭文件:
#include <iostream>
using namespace std;
5、創(chuàng)建main函數(shù),并修改函數(shù)體如下:
int main()
{
MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
// 初始化MYSQL變量
mysql_init(&mysql);
// 連接Mysql服務(wù)器,本例使用本機(jī)作為服務(wù)器。訪問的數(shù)據(jù)庫名稱為“msyql”,參數(shù)中的user為你的登錄用戶名,***為登錄密碼,需要根據(jù)你的實(shí)際用戶進(jìn)行設(shè)置
if (!mysql_real_connect(&mysql, “127.0.0.1”, “user”, “123”, “mysql”, 3306, 0, 0))
{
cout << “mysql_real_connect failure!” << endl;
return 0;
}
// 查詢mysql數(shù)據(jù)庫中的user表
if (mysql_real_query(&mysql, “select * from user”, (unsigned long)strlen(“select * from user”)))
{
cout << “mysql_real_query failure!” << endl;
return 0;
}
// 存儲(chǔ)結(jié)果集
res = mysql_store_result(&mysql);
if (NULL == res)
{
cout << “mysql_store_result failure!” << endl;
return 0;
}
// 重復(fù)讀取行,并輸出第一個(gè)字段的值,直到row為NULL
while (row = mysql_fetch_row(res))
{
cout << row[0] << endl;
}
// 釋放結(jié)果集
mysql_free_result(res);
// 關(guān)閉Mysql連接
mysql_close(&mysql);
return 0;
}
6、將mysql安裝目錄中的libmysql.dll動(dòng)態(tài)庫文件拷貝到工程的當(dāng)前目錄,運(yùn)行程序。
如果你跟雞啄米一樣使用的是mysql的64位版本,此時(shí)程序會(huì)報(bào)錯(cuò),有很多不能解析的符號(hào),這是因?yàn)槲覀兊墓こ淌?2位的,應(yīng)該改為64位,方法是,上面的工程屬性頁的右上角有個(gè)Configuration Manager按鈕,點(diǎn)擊它彈出Configuration Manager對(duì)話框,下面的列表中可以看到有我們的工程,Platform列顯示為“Win32”:
這里需要點(diǎn)擊右側(cè)的箭頭下拉,選擇New彈出New Project Platform對(duì)話框,New platform選擇x64創(chuàng)建新Platform:
上述的Platform列選擇x64就可以了。再次運(yùn)行程序,你會(huì)發(fā)現(xiàn)它果然不報(bào)錯(cuò)了。
本文就到這里了,到此大家應(yīng)該對(duì)Mysql C API編程有了基本的了解了,在實(shí)際開發(fā)中可以不斷深入研究。
關(guān)鍵字:Mysql、API、數(shù)據(jù)庫
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解