摘要:MySQL數據庫作為一種網絡數據庫性能十分出色,但其在應用軟件中使用較少。本文將主要探討MySQL提供的兩種數據庫接口 ——(ODBC API和C API)在VC中的應用,並且形成一個類用以封裝C API數據庫接口的功能。
關鍵詞: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函數實現的。
3.2 CDatabase類在VC中的應用
第一步 建立初始化MySQL對象,並且將其初始化。即定義CDatabase類對象,這樣程序就會自動調用構造函數CDatabase(),完成初始化。
構造函數實現如下:
CDatabase::CDatabase ()
{
mysql_init (&MySQL);
}
完成初始化只需定義CDatabase類對象,即
CDatabase base;
第二步 連接服務器,並連接需要的數據庫。即調用ConnectDB(Database_Param *p)函數,結構體Database_Param中存放數據庫參數,包括主機名、用戶名、密碼、數據庫名等。該函數如返回TRUE表示連接成功,否則表示失敗。
連接函數實現如下:
BOOL CDatabase::ConnectDB(Database_Param *p)
{
if(!mysql_real_connect(&MySQL,p->host,p->user,p->passWord,p->db,p->port,p->unix_socket,p->clIEnt_flag))
{
OutErrors(); // 輸出錯誤信息
return false;
}
return true;
}
第三步 對數據庫進行加鎖。即調用LockTable(char* TableName,char* PRIORITY),對相應的表TableName完成相應屬
MySQL教程是:MySQL數據庫接口的VC實現與應用(2)。性PRIORITY的加鎖,使程序兼容多線程功能。 加鎖函數實現如下:
BOOL CDatabase::LockTable(char* TableName,char* PRIORITY)
{
char str[50];
sprintf(str,"LOCK TABLES %s %s",TableName,PRIORITY);
if(mysql_query(&MySQL,str))
return false;
return true;
}
第四步 完成數據庫操作。即根據需要調用UpdateRecord(Data_Param *para)、SelectRecord(Data_Param *para)、InsertRecord(Data_Param *para)、DelRecord(Data_Param *para)等操作。其中的結構體Data_Param中存放數據庫操作參數。上述兩個結構體的定義在global.h中。 InsertRecord函數實現如下,其它實現方法相似:
BOOL CDatabase::InsertRecord(Data_Param *para)
{
char str[80];
sprintf(str,"insert into %s values(%s)",para->tab_name,para->insert_val);
if(mysql_query(&MySQL,str))
return false;
return true;
}
第五步 解鎖數據庫。即調用UnLockTable(),完成對上述被加鎖的表的解鎖。 解鎖函數實現如下:
BOOL CDatabase::UnLockTable()
{
if(mysql_query(&MySQL,"UNLOCK TABLES"))
return false;
return true;
}
第六步 關閉數據庫連接。即調用析構函數~CDatabase(),關閉數據庫,並自動釋放初始化時定義的CDatabase類對象。 析構函數如下:
CDatabase::~CDatabase()
{
if(query)
MySQL_free_result(query);
mysql_close(&MySQL);
}
注意:在編譯程序時,必須加入MySQL的庫文件libMySQL.lib。