自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL數(shù)據(jù)庫(kù)接口的VC實(shí)現(xiàn)與應(yīng)用

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維 MySQL
本文將詳細(xì)介紹VC環(huán)境中MySQL數(shù)據(jù)庫(kù)服務(wù)器不同接口的應(yīng)用,并最終將產(chǎn)生一個(gè)CDatabase類封裝MySQL數(shù)據(jù)庫(kù)接口功能。

引言

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

由此可見(jiàn),MySQL數(shù)據(jù)庫(kù)服務(wù)器在網(wǎng)站建設(shè)中的表現(xiàn)是十分出色的。但是,正因?yàn)檫@樣,幾乎很少有人將MySQL用于應(yīng)用軟件的開(kāi)發(fā)中。

數(shù)據(jù)庫(kù)接口實(shí)現(xiàn)與應(yīng)用的計(jì)算機(jī)環(huán)境:硬件,C466、128M、15G;軟件及操作系統(tǒng),VISUAL C++ 6.0、MySQL 3.23.22-beta for win32、WIN98。

1 MySQL數(shù)據(jù)庫(kù)簡(jiǎn)介

MySQL 是一個(gè)真正的多用戶、多線程SQL數(shù)據(jù)庫(kù)服務(wù)器。SQL(結(jié)構(gòu)化查詢語(yǔ)言)是世界上最流行的和標(biāo)準(zhǔn)化的數(shù)據(jù)庫(kù)語(yǔ)言,它使得存儲(chǔ)、更新和存取信息更加容易。 MySQL是一個(gè)客戶機(jī)/服務(wù)器結(jié)構(gòu)的實(shí)現(xiàn),它由一個(gè)服務(wù)器守護(hù)程序mysqld和許多不同的客戶程序以及庫(kù)組成的。

MySQL 的主要目標(biāo)是快速、健壯和易用。最初是因?yàn)镸ySQL的創(chuàng)始人需要這樣的一個(gè)SQL服務(wù)器,它能處理與任何不昂貴硬件平臺(tái)上提供數(shù)據(jù)庫(kù)的廠家在一個(gè)數(shù)量級(jí) 上的大型數(shù)據(jù)庫(kù),但速度更快,MySQL因此就開(kāi)發(fā)出來(lái)了。它提供C,C++,JAVA(JDBC),Perl,Python,PHP and TCL 的API接口;多平臺(tái)支持,包括Solaris,SunOS,BSDI,SGI IRIX,AIX,DEC UNIX,Linux,F(xiàn)reeBSD,SCO OpenServer,NetBSD,OpenBSD,HPUX,Win9x and NT;多樣的數(shù)據(jù)類型,包括有/無(wú)符號(hào)1,2,3,4,8字節(jié)integers,F(xiàn)LOAT,DOUBLE,CHAR,VARCHAR,TEXT, BLOB,DATE,DATETIME,YEAR,SET,ENUM;非常靈活和安全的權(quán)限系統(tǒng),密碼加密;為Windows提供ODBC接口,可通過(guò) Access與之相聯(lián),另有第三方開(kāi)發(fā)商提供多樣的 ODBC驅(qū)動(dòng)程序;在MySQL 3.23中使用新MyISAM最大的表大小可達(dá)8百萬(wàn) TB(2^63個(gè)字節(jié));多種語(yǔ)言支持,但不支持中文。然而,為了實(shí)現(xiàn)快速、健壯和易用的目的,MySQL必須犧牲一部分靈活而強(qiáng)大的功能,如子查詢、存 儲(chǔ)過(guò)程與觸發(fā)器、外鍵、事物處理等。因而,MySQL在某些應(yīng)用中缺乏靈活性,但這也使它對(duì)數(shù)據(jù)的處理速度較其它數(shù)據(jù)庫(kù)服務(wù)器至少快2~3倍。

MySQL 自身不支持Windows的圖形界面,因此,所有的數(shù)據(jù)庫(kù)操作及管理功能都只能在MS-DOS方式下完成。首先,必須登陸MySQL服務(wù)器,即在提示符\ MySQL\BIN>下輸入MYSQL –H host –U user –Ppassword,提示符改為mysql>時(shí)表示登陸成功。然后,選擇所操作的數(shù)據(jù)庫(kù),即mysql> USE databasename。接著就可以用SQL語(yǔ)句進(jìn)行查詢了。如果需要退出數(shù)據(jù)庫(kù)服務(wù)器,可執(zhí)行QUIT命令,這樣就成功退出服務(wù)器了。當(dāng)然,由于 MySQL的知名度日益增加,許多第三方軟件公司推出了MySQL在Windows環(huán)境中的具有圖形界面的支持軟件,如EMS公司的EMS MYSQL MANAGER就提供了Windows形式的MySQL數(shù)據(jù)庫(kù)操作功能。

2 利用ODBC API實(shí)現(xiàn)MySQL數(shù)據(jù)庫(kù)功能調(diào)用

ODBC(Open Database Connectivity)即開(kāi)放式數(shù)據(jù)庫(kù)互聯(lián),作為Windows開(kāi)放性結(jié)構(gòu)的一個(gè)重要部分已經(jīng)為很多的Windows程序員所熟悉,ODBC的工作依 賴于數(shù)據(jù)庫(kù)制造商提供的驅(qū)動(dòng)程序,使用ODBC API的時(shí)候,Windows的ODBC管理程序把數(shù)據(jù)庫(kù)訪問(wèn)的請(qǐng)求傳遞給正確的驅(qū)動(dòng)程序,驅(qū)動(dòng)程序再使用SQL語(yǔ)句指示DBMS(數(shù)據(jù)庫(kù)管理系統(tǒng))完成 數(shù)據(jù)庫(kù)訪問(wèn)工作,因此,ODBC的存在為我們開(kāi)發(fā)應(yīng)用數(shù)據(jù)庫(kù)程序提供了非常強(qiáng)大的能力和靈活性。在Windows下可以對(duì)多種數(shù)據(jù)庫(kù)安裝ODBC數(shù)據(jù)庫(kù), 用來(lái)連接數(shù)據(jù)庫(kù)并訪問(wèn)它們的數(shù)據(jù)。

對(duì)于MySQL數(shù)據(jù)庫(kù)服務(wù)器來(lái)說(shuō),它的制造商同樣提供了相應(yīng)的ODBC驅(qū)動(dòng)程序,其最新版本為myodbc-2.50.31-win95。在WIN98環(huán)境下進(jìn)行安裝后,就可以利用編程語(yǔ)言通過(guò)ODBC API對(duì)MySQL數(shù)據(jù)庫(kù)進(jìn)行各種ODBC所支持的操作。因?yàn)镺DBC屏蔽了各種數(shù)據(jù)庫(kù)的差異,所以,原來(lái)用于對(duì)其它數(shù)據(jù)庫(kù)進(jìn)行操作的程序,通過(guò)ODBC同樣能夠?qū)ySQL數(shù)據(jù)庫(kù)進(jìn)行操作。也就是說(shuō),ODBC使程序?qū)?shù)據(jù)庫(kù)的通用性提高了。

用VC通過(guò)ODBC API對(duì)MySQL數(shù)據(jù)庫(kù)進(jìn)行編程,必須要對(duì)MySQL數(shù)據(jù)源進(jìn)行設(shè)置,具體設(shè)置如圖1:

圖1 數(shù)據(jù)源設(shè)置信息

通過(guò)上圖的設(shè)置,接著我們就可以按照一般的ODBC數(shù)據(jù)庫(kù)編程方法,對(duì)MySQL數(shù)據(jù)庫(kù)進(jìn)行編程。

#p#

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ù)類型組成,這些函數(shù)與MySQL 服務(wù)器進(jìn)行通信并訪問(wèn)數(shù)據(jù)庫(kù),可以直接操控?cái)?shù)據(jù)庫(kù),因而顯著地提高了操控效能。

C API數(shù)據(jù)類型包括:MYSQL(數(shù)據(jù)庫(kù)連接句柄)、MYSQL_RES(查詢返回結(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ù)操作類CDatabase通過(guò)C API的實(shí)現(xiàn)以及在VC中的應(yīng)用。

3.1 CDatabase類的實(shí)現(xiàn)

CDatabase類封裝了MySQL數(shù)據(jù)庫(kù)的功能,因此不具備通用性,只能在對(duì)MySQL的應(yīng)用程序中使用。下面將根據(jù)C++要求及規(guī)范給出CDatabase類的具體結(jié)構(gòu)以及相關(guān)簡(jiǎn)要介紹:

1 class CDatabase
2 {
3 public:
4 BOOL UnLockTable(); //解鎖
5 BOOL LockTable(char* TableName,char* PRIORITY); //加鎖
6 int Reload(); //重新登陸,非零時(shí)返回錯(cuò)誤信息
7 char* GetState(); //服務(wù)器狀態(tài)
8 char* GetServerInfo(); //服務(wù)器信息
9 int GetProtocolInfo(); //協(xié)議信息
10 char* GetHostInfo(); //主機(jī)信息
11 char * GetClientInfo(); //客戶機(jī)信息
12 char* GetFieldName(int FieldNum); //字段名
13 BOOL IsEnd(); //是否最后
14 int DropDB(char *db); //刪除數(shù)據(jù)庫(kù),非零時(shí)返回錯(cuò)誤信息
15 void SeekData(int offset); //查找指定數(shù)據(jù)
16 int CreateDB(char *db); //創(chuàng)建數(shù)據(jù)庫(kù),非零時(shí)返回錯(cuò)誤信息
17 void FreeRecord(); //釋放結(jié)果集
18 unsigned int GetFieldNum(); //得到字段數(shù)
19 BOOL ConnectDB(Database_Param *p); //連接數(shù)據(jù)庫(kù)
20 MYSQL_ROW GetRecord(); //得到結(jié)果(一個(gè)記錄)
21 my_ulonglong GetRowNum(); //得到記錄數(shù)
22 BOOL SelectDB(Data_Param *para); //選擇數(shù)據(jù)庫(kù)
23 BOOL UpdateRecord(Data_Param *para); //更新記錄
24 BOOL SelectRecord(Data_Param *para); //選擇記錄
25 BOOL InsertRecord(Data_Param *para); //插入記錄
26 BOOL DelRecord(Data_Param *para); //刪除記錄
27 BOOL SelectAll(Data_Param *para); //選擇所有記錄
28 char * OutErrors(); //輸出錯(cuò)誤信息
29 CDatabase(); //初始化數(shù)據(jù)庫(kù)
30 virtual ~CDatabase(); //關(guān)閉數(shù)據(jù)庫(kù)連接
31 private:
32 MYSQL mysql; //數(shù)據(jù)庫(kù)連接句柄
33 MYSQL_RES *query; //結(jié)果集
34 MYSQL_ROW row; //記錄集
35 MYSQL_FIELD *field; //字段信息(結(jié)構(gòu)體)
36 BOOL FindSave(char *str); //查找并保存結(jié)果集
37 };

 
通過(guò)CDatabase類中定義的這些功能函數(shù),我們可以通過(guò)遠(yuǎn)程或本機(jī)完成對(duì)MySQL數(shù)據(jù)庫(kù)的絕大部分操控,并且由于定義了解鎖和加鎖功能,使得應(yīng)用程序能夠多線程或多進(jìn)程地訪問(wèn)數(shù)據(jù)庫(kù),大大提高了效能。以上函數(shù)的具體功能都是通過(guò)調(diào)用C API函數(shù)實(shí)現(xiàn)的。

3.2 CDatabase類在VC中的應(yīng)用

第一步 建立初始化MySQL對(duì)象,并且將其初始化。即定義CDatabase類對(duì)象,這樣程序就會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)CDatabase(),完成初始化。

構(gòu)造函數(shù)實(shí)現(xiàn)如下:

1CDatabase::CDatabase ()
2{
3mysql_init (mysql);
4}

完成初始化只需定義CDatabase類對(duì)象,即5CDatabase base;

第二步 連接服務(wù)器,并連接需要的數(shù)據(jù)庫(kù)。即調(diào)用ConnectDB(Database_Param *p)函數(shù),結(jié)構(gòu)體Database_Param中存放數(shù)據(jù)庫(kù)參數(shù),包括主機(jī)名、用戶名、密碼、數(shù)據(jù)庫(kù)名等。該函數(shù)如返回TRUE表示連接成功,否則表示失敗。

連接函數(shù)實(shí)現(xiàn)如下:

1 BOOL CDatabase::ConnectDB(Database_Param *p)
2 {
3 if(!mysql_real_connect(mysql,p->host,p->user,p->password,

p->db,p->port,p->unix_socket,p->client_flag))
4 {
5 OutErrors(); // 輸出錯(cuò)誤信息
6 return false;
7 }
8 return true;
9 }

第三步 對(duì)數(shù)據(jù)庫(kù)進(jìn)行加鎖。即調(diào)用LockTable(char* TableName,char* PRIORITY),對(duì)相應(yīng)的表TableName完成相應(yīng)屬性PRIORITY的加鎖,使程序兼容多線程功能。 加鎖函數(shù)實(shí)現(xiàn)如下:

1 BOOL CDatabase:: LockTable(char* TableName,char* PRIORITY)
2 {
3 char str[50];
4 sprintf(str,"LOCK TABLES %s %s",TableName,PRIORITY);
5 if(mysql_query(mysql,str))
6 return false;
7 return true;}

第四步 完成數(shù)據(jù)庫(kù)操作。即根據(jù)需要調(diào)用UpdateRecord(Data_Param *para)、SelectRecord(Data_Param *para)、InsertRecord(Data_Param *para)、DelRecord(Data_Param *para)等操作。其中的結(jié)構(gòu)體Data_Param中存放數(shù)據(jù)庫(kù)操作參數(shù)。上述兩個(gè)結(jié)構(gòu)體的定義在global.h中。 InsertRecord函數(shù)實(shí)現(xiàn)如下,其它實(shí)現(xiàn)方法相似:

1 BOOL CDatabase::InsertRecord(Data_Param *para)
2 {
3 char str[80];
4 sprintf(str,"insert into %s values(%s)",para->tab_name,para->insert_val);
5 if(mysql_query(mysql,str))
6 return false;
7  return true;
8 }


第五步 解鎖數(shù)據(jù)庫(kù)。即調(diào)用UnLockTable(),完成對(duì)上述被加鎖的表的解鎖。 解鎖函數(shù)實(shí)現(xiàn)如下:

第六步 關(guān)閉數(shù)據(jù)庫(kù)連接。即調(diào)用析構(gòu)函數(shù)~CDatabase(),關(guān)閉數(shù)據(jù)庫(kù),并自動(dòng)釋放初始化時(shí)定義的CDatabase類對(duì)象。 析構(gòu)函數(shù)如下:CDatabase::~CDatabase()

1 {
2 if(query)
3 mysql_free_result(query);
4 mysql_close(mysql);
5 }

注意:在編譯程序時(shí),必須加入MySQL的庫(kù)文件libmySQL.lib。

4 MySQL性能測(cè)試

4.1 ODBC API 通過(guò)索引讀取200萬(wàn)行:528秒

插入35萬(wàn)行: 750秒

4.2 C API

通過(guò)索引讀取200萬(wàn)行:412秒

插入35萬(wàn)行:435秒

4.3 其它數(shù)據(jù)庫(kù)(以MS_SQL為例,WINNT環(huán)境)

通過(guò)索引讀取200萬(wàn)行:1634秒

插入35萬(wàn)行:4012秒

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

5 結(jié)束語(yǔ)

MySQL 作為一個(gè)免費(fèi)的SQL數(shù)據(jù)庫(kù),雖然功能不夠十分強(qiáng)大,且靈活性較差,但是,已經(jīng)能夠滿足一般應(yīng)用軟件的要求,而且MySQL數(shù)據(jù)庫(kù)的開(kāi)發(fā)者也在力求使之更 加完善。并且,由MySQL性能測(cè)試可以看出,它對(duì)數(shù)據(jù)的處理速度明顯快于其它數(shù)據(jù)庫(kù)服務(wù)器。因此,如果應(yīng)用軟件對(duì)數(shù)據(jù)庫(kù)的性能要求較高,而同時(shí)對(duì)數(shù)據(jù)庫(kù) 操作的功能及靈活性的要求不是很高的話,并且前期投入資金較少時(shí),MySQL數(shù)據(jù)庫(kù)服務(wù)器不失為一個(gè)最佳的選擇。

【編輯推薦】

  1. 深入淺出MySQL雙向復(fù)制技術(shù)
  2. MySQL百萬(wàn)級(jí)高并發(fā)網(wǎng)站實(shí)戰(zhàn)攻略
  3. 在Windows系統(tǒng)上安裝Apache,MySQL
責(zé)任編輯:彭凡 來(lái)源: IT168
相關(guān)推薦

2010-05-13 14:57:03

MySQL數(shù)據(jù)庫(kù)接口

2010-06-12 17:06:44

2010-06-01 10:47:21

連接MySQL數(shù)據(jù)庫(kù)

2010-06-09 10:09:39

MySQL 數(shù)據(jù)庫(kù)導(dǎo)入

2010-06-02 16:57:50

MySQL數(shù)據(jù)庫(kù)同步

2010-10-26 15:54:02

連接oracle數(shù)據(jù)庫(kù)

2010-05-13 13:49:09

MySQL數(shù)據(jù)庫(kù)

2011-08-23 15:16:54

OracleMySQL

2010-05-26 10:15:11

MySQL數(shù)據(jù)庫(kù)

2010-06-04 10:05:55

MySQL數(shù)據(jù)庫(kù)還原

2011-03-11 16:42:51

Oracle數(shù)據(jù)庫(kù)視圖

2011-07-28 17:02:59

MYSQL數(shù)據(jù)庫(kù)跨表更新數(shù)據(jù)并合

2019-07-05 11:20:31

PythonMySQL數(shù)據(jù)庫(kù)

2010-05-20 15:22:37

2010-05-28 11:41:46

MySQL數(shù)據(jù)庫(kù)備份

2018-05-14 16:14:56

數(shù)據(jù)庫(kù)MySQL分表與分區(qū)

2011-07-06 10:49:50

MySQL優(yōu)化

2024-04-08 10:11:15

MYSQL數(shù)據(jù)庫(kù)事務(wù)

2010-05-12 17:45:03

MySQL數(shù)據(jù)庫(kù)引擎

2010-06-12 14:02:13

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)