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

MySQL數據庫接口的VC具體實現與應用

編輯:關於MYSQL數據庫

    摘要:MySQL數據庫作為一種網絡數據庫性能十分出色,但其在應用軟件中使用較少。本文將主要探討MySQL提供的兩種數據庫接口 ——(ODBC API和C API)在VC中的應用,並且形成一個類用以封裝C API數據庫接口的功能。

    關鍵詞:MySQL;數據庫接口;ODBC API;C API

    引言

    隨著現代計算機軟硬件及網絡技術的發展,在網上查找資料已成為現在獲取信息的最重要手段之一。眾所周知,所有的網上信息都是儲存在網站數據庫中的,這些信息的查詢、更新等操作的功能則是由數據庫服務器提供的,顯然,數據庫服務器的性能將直接關系到網站的生存。網站搭建中用的最多的數據庫服務器是oracle和MySQL,前者功能強大,屬於旗艦型數據庫服務器,但前期投入太大;後者功能不斷完善,簡單易用而又不失性能,並且可以免費獲得。因此,許多中小型網站的數據庫服務器選用MySQL,而且,由於MySQL性能出色,一些大型網站也選用了MySQL。

    由此可見,MySQL數據庫服務器在網站建設中的表現是十分出色的。但是,正因為這樣,幾乎很少有人將MySQL用於應用軟件的開發中。本文將詳細介紹VC環境中MySQL數據庫服務器不同接口的應用,並最終將產生一個CDatabase類封裝MySQL數據庫接口功能。

    數據庫接口實現與應用的計算機環境:硬件,C466、128M、15G;軟件及操作系統,VISUAL C++ 6.0、MySQL 3.23.22-beta for win32、WIN98。

    MySQL數據庫簡介

    MySQL是一個真正的多用戶、多線程SQL數據庫服務器。SQL(結構化查詢語言)是世界上最流行的和標准化的數據庫語言,它使得存儲、更新和存取信息更加容易。MySQL是一個客戶機/服務器結構的實現,它由一個服務器守護程序mysqld和許多不同的客戶程序以及庫組成的。

    MySQL的主要目標是快速、健壯和易用。最初是因為MySQL的創始人需要這樣的一個SQL服務器,它能處理與任何不昂貴硬件平台上提供數據庫的廠家在一個數量級上的大型數據庫,但速度更快,MySQL因此就開發出來了。

    它提供C,C++,JAVA(JDBC),Perl,Python,PHP and TCL 的API接口;多平台支持,包括Solaris,SunOS,BSDI,SGI IRIX,AIX,DEC UNIX,Linux,FreeBSD,SCO OpenServer,NetBSD,OpenBSD,HPUX,Win9x and NT;多樣的數據類型,包括有/無符號1,2,3,4,8字節integers,FLOAT,DOUBLE,CHAR,VARCHAR,TEXT,BLOB,DATE,DATETIME,YEAR,SET,ENUM;非常靈活和安全的權限系統,密碼加密;為Windows提供ODBC接口,可通過Access與之相聯,另有第三方開發商提供多樣的 ODBC驅動程序;在MySQL 3.23中使用新MyISAM最大的表大小可達8百萬 TB(2^63個字節);多種語言支持,但不支持中文。

    然而,為了實現快速、健壯和易用的目的,MySQL必須犧牲一部分靈活而強大的功能,如子查詢、存儲過程與觸發器、外鍵、事物處理等。因而,MySQL在某些應用中缺乏靈活性,但這也使它對數據的處理速度較其它數據庫服務器至少快2~3倍。

    MySQL自身不支持Windows的圖形界面,因此,所有的數據庫操作及管理功能都只能在MS-DOS方式下完成。首先,必須登陸MySQL服務器,即在提示符MySQLBIN>下輸入MYSQL –H host –U user –Ppassword,提示符改為mysql>時表示登陸成功。然後,選擇所操作的數據庫,即mysql> USE databasename。接著就可以用SQL語句進行查詢了。如果需要退出數據庫服務器,可執行QUIT命令,這樣就成功退出服務器了。

    當然,由於MySQL的知名度日益增加,許多第三方軟件公司推出了MySQL在Windows環境中的具有圖形界面的支持軟件,如EMS公司的EMS MYSQL MANAGER就提供了Windows形式的MySQL數據庫操作功能。

     

    2 利用ODBC API實現MySQL數據庫功能調用

    ODBC(Open Database Connectivity)即開放式數據庫互聯,作為Windows開放性結構的一個重要部分已經為很多的Windows程序員所熟悉,ODBC的工作依賴於數據庫制造商提供的驅動程序,使用ODBC API的時候,Windows的ODBC管理程序把數據庫訪問的請求傳遞給正確的驅動程序,驅動程序再使用SQL語句指示DBMS(數據庫管理系統)完成數據庫訪問工作,因此,ODBC的存在為我們開發應用數據庫程序提供了非常強大的能力和靈活性。在Windows下可以對多種數據庫安裝ODBC數據庫,用來連接數據庫並訪問它們的數據。

    對於MySQL數據庫服務器來說,它的制造商同樣提供了相應的ODBC驅動程序,其最新版本為myodbc-2.50.31-win95。在WIN98環境下進行安裝後,就可以利用編程語言通過ODBC API對MySQL數據庫進行各種ODBC所支持的操作。因為ODBC屏蔽了各種數據庫的差異,所以,原來用於對其它數據庫進行操作的程序,通過ODBC同樣能夠對MySQL數據庫進行操作。也就是說,ODBC使程序對數據庫的通用性提高了。

    用VC通過ODBC API對MySQL數據庫進行編程,必須要對MySQL數據源進行設置,具體設置如圖1:

     

     

    圖1 數據源設置信息

    通過上圖的設置,接著我們就可以按照一般的ODBC數據庫編程方法,對MySQL數據庫進行編程。

     

    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完成相應屬性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。

     

    4 MySQL性能測試

    4.1 ODBC API

    通過索引讀取200萬行:528秒

    插入35萬行: 750秒

    4.2 C API

    通過索引讀取200萬行:412秒

    插入35萬行:435秒

    4.3 其它數據庫(以MS_SQL為例,WINNT環境)

    通過索引讀取200萬行:1634秒

    插入35萬行:4012秒

    注:以上數據是多次測量的平均值,不可避免一定的誤差,僅供參考。

    5 結束語

    MySQL作為一個免費的SQL數據庫,雖然功能不夠十分強大,且靈活性較差,但是,已經能夠滿足一般應用軟件的要求,而且MySQL數據庫的開發者也在力求使之更加完善。並且,由MySQL性能測試可以看出,它對數據的處理速度明顯快於其它數據庫服務器。因此,如果應用軟件對數據庫的性能要求較高,而同時對數據庫操作的功能及靈活性的要求不是很高的話,並且前期投入資金較少時,MySQL數據庫服務器不失為一個最佳的選擇。

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