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