程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> MySQL數據庫接口的VC實現與應用(2)

MySQL數據庫接口的VC實現與應用(2)

編輯:關於MYSQL數據庫

摘要: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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved