關(guān)鍵詞:MySQL;數(shù)據(jù)庫(kù)接口;ODBC API;C API
3 利用MySQL自帶的C API函數(shù)實(shí)現(xiàn)數(shù)據(jù)庫(kù)功能調(diào)用
由于各個(gè)數(shù)據(jù)庫(kù)之間的差異,它們所提供的數(shù)據(jù)庫(kù)功能也就各有不同。這樣,通過(guò)ODBC API就不可能完全擁有所有的數(shù)據(jù)庫(kù)功能,因而影響了程序?qū)?shù)據(jù)庫(kù)的控制功能,也就不能充分發(fā)揮數(shù)據(jù)庫(kù)的能力。并且這種統(tǒng)一的接口還是以損失效能為前提的,這就使數(shù)據(jù)庫(kù)操作時(shí)間延長(zhǎng)。所以,為了解決以上問(wèn)題,MySQL的制造商在提供ODBC驅(qū)動(dòng)程序的基礎(chǔ)上,還提供了各種編程環(huán)境下的API,其中包括C API。這些API函數(shù)很顯然能盡可能地發(fā)揮數(shù)據(jù)庫(kù)的能力,并減少數(shù)據(jù)庫(kù)操作的延長(zhǎng)時(shí)間,但卻使程序的通用性受到嚴(yán)重影響。
MySQL提供了一套C API函數(shù),它由一組函數(shù)以及一組用于函數(shù)的數(shù)據(jù)類(lèi)型組成,這些函數(shù)與MySQL 服務(wù)器進(jìn)行通信并訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),可以直接操控?cái)?shù)據(jù)庫(kù),因而顯著地提高了操控效能。
C API數(shù)據(jù)類(lèi)型包括:MYSQL(數(shù)據(jù)庫(kù)連接句柄)、MYSQL_RES(查詢(xún)返回結(jié)果集)、MYSQL_ROW(行集)、MYSQL_FIELD(字段信息)、MYSQL_FIELD_OFFSET(字段表的偏移量)、my_ulonglong(自定義的無(wú)符號(hào)整型數(shù))等;C API提供的函數(shù)包括:mysql_close()、mysql_connect()、mysql_query()、mysql_store_result()、mysql_init()等,其中mysql_query()最為重要,能完成絕大部分的數(shù)據(jù)庫(kù)操控。
下面將具體討論數(shù)據(jù)庫(kù)操作類(lèi)CDatabase通過(guò)C API的實(shí)現(xiàn)以及在VC中的應(yīng)用。
3.1 CDatabase類(lèi)的實(shí)現(xiàn)
CDatabase類(lèi)封裝了MySQL數(shù)據(jù)庫(kù)的功能,因此不具備通用性,只能在對(duì)MySQL的應(yīng)用程序中使用。下面將根據(jù)C++要求及規(guī)范給出CDatabase類(lèi)的具體結(jié)構(gòu)以及相關(guān)簡(jiǎn)要介紹:
class CDatabase
{
public:
BOOL UnLockTable(); //解鎖
BOOL LockTable(char* TableName,char* PRIORITY); //加鎖
int Reload(); //重新登陸,非零時(shí)返回錯(cuò)誤信息
char* GetState(); //服務(wù)器狀態(tài)
char* GetServerInfo(); //服務(wù)器信息
int GetProtocolInfo(); //協(xié)議信息
char* GetHostInfo(); //主機(jī)信息
char * GetClientInfo(); //客戶(hù)機(jī)信息
char* GetFieldName(int FieldNum); //字段名
BOOL IsEnd(); //是否最后
int DropDB(char *db); //刪除數(shù)據(jù)庫(kù),非零時(shí)返回錯(cuò)誤信息
void SeekData(int offset); //查找指定數(shù)據(jù)
int CreateDB(char *db); //創(chuàng)建數(shù)據(jù)庫(kù),非零時(shí)返回錯(cuò)誤信息
void FreeRecord(); //釋放結(jié)果集
unsigned int GetFieldNum(); //得到字段數(shù)
BOOL ConnectDB(Database_Param *p); //連接數(shù)據(jù)庫(kù)
MYSQL_ROW GetRecord(); //得到結(jié)果(一個(gè)記錄)
my_ulonglong GetRowNum(); //得到記錄數(shù)
BOOL SelectDB(Data_Param *para); //選擇數(shù)據(jù)庫(kù)
BOOL UpdateRecord(Data_Param *para); //更新記錄
BOOL SelectRecord(Data_Param *para); //選擇記錄
BOOL InsertRecord(Data_Param *para); //插入記錄
BOOL DelRecord(Data_Param *para); //刪除記錄
BOOL SelectAll(Data_Param *para); //選擇所有記錄
char * OutErrors(); //輸出錯(cuò)誤信息
CDatabase(); //初始化數(shù)據(jù)庫(kù)
virtual ~CDatabase(); //關(guān)閉數(shù)據(jù)庫(kù)連接
private:
MYSQL mysql; //數(shù)據(jù)庫(kù)連接句柄
MYSQL_RES *query; //結(jié)果集
MYSQL_ROW row; //記錄集
MYSQL_FIELD *field; //字段信息(結(jié)構(gòu)體)
BOOL FindSave(char *str); //查找并保存結(jié)果集
};
通過(guò)CDatabase類(lèi)中定義的這些功能函數(shù),我們可以通過(guò)遠(yuǎn)程或本機(jī)完成對(duì)MySQL數(shù)據(jù)庫(kù)的絕大部分操控,并且由于定義了解鎖和加鎖功能,使得應(yīng)用程序能夠多線(xiàn)程或多進(jìn)程地訪(fǎng)問(wèn)數(shù)據(jù)庫(kù),大大提高了效能。以上函數(shù)的具體功能都是通過(guò)調(diào)用C API函數(shù)實(shí)現(xiàn)的。
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com