在VC++中建立自定義資料庫類 (轉)

gugu99發表於2007-11-12
在VC++中建立自定義資料庫類 (轉)[@more@]

在VC++中建立自定義類

哈爾濱工程大學計算中心
李健萍 李春豔 張積東

摘要

---- 本文較為詳細的介紹了一個使用OC對資料庫進行操作的CdataBaseOperate類的建立,並給出了幾個主要的具體實現,以及該類在實際的應用中的使用。

---- 眾所周知VC++的MFC類庫為者編制好了對資料庫操作的類,程式設計者可以使用嚮導建立一個與資料庫聯結並對資料庫進行操作的應用程式,不需要編制任何程式碼,這無疑為程式設計人員提供了一個捷徑。但是,使用嚮導時只有選用基於單文件或多文件的專案才能選擇資料來源,與指定的的資料庫相連,對用嚮導生成的基於對話方塊的應用程式不提供資料庫的支援。即使是基於單文件或多文件的應用程式,當需要一些特殊的操作,例如,開啟一個表,要求返回滿足一定條件的記錄集時,MFC並沒有提供完全符合要求的現成函式。如果,能利用MFC所提供的資料庫操作,再加上自己設計的函式,也就是說,設計一個對資料庫操作的類,在程式中手工加入這個類,那麼就可以在基於對話方塊的應用程式中實現對資料庫的操作,而且,也可以針對自己應用程式的具體需要來設計類的函式,為特定功能的實現提供了很大的方便。

---- 在一個涉及資料庫操作的應用程式中,常用到的MFC類有CdaoDatabase類、CdaoTableDef類、CdaoRecordset類和 CdaoQueryDef類,當對資料庫進行操作時,需要先開啟資料庫,然後開啟資料庫中的表,再得到查詢集和記錄集。在自己定義的類中綜合這四個類的操作,設計一個開啟表得到查詢集和記錄集的函式,以後,在應用程式中使用該類時只需包含該類的頭,所設計的函式就可以直接了。

---- 建立資料庫類的過程可分為如下四步:

---- 一、定義一個無基類的CdataBaseOperate類

---- 1、在Workspace視窗選擇ClassView選項卡,在樹型類結構圖的根部單擊滑鼠右鍵,選擇New Class…,將彈出建立新類的對話方塊;

---- 2、在Class type中選擇Generic Class;

---- 3、在Name中填寫要建的新類的名稱,要以大寫字母C開頭,系統會自動建立新類的標頭檔案和實現檔案,檔案的名稱為類名去掉第一個大寫字母C,如果想改變檔案的名稱,可以單擊change按鈕.

---- 4、在填寫好各項後,按OK按鈕確定,一個無基類的新類建立成功,但,他還是一個空類,下一步,就要給類新增內容.

---- 二、在自定義的類中加入有關的定義

---- 1、在本應用程式中,使用ODBC與 SERVER的資料庫相連,因而,在類的實現檔案建構函式前加入如下的定義: #define SQL_DATABASE _T("ODBC;DSN=sql-database;UID=sa;PWD=pass;") DSN=sql-database表示建立的ODBC聯接的名稱是sql-database,如果選用其他資料庫,只需在此改變與所需資料庫建立的聯接,或是重新sql-database 使之聯接新的資料庫。UID=sa;PWD=pass表示登入資料庫的名是sa,密碼是pass,如果密碼是空則表示為PWD=""。

---- 2、在該類中綜合使用到了MFC類庫提供的有關資料庫的幾個類CdaoDatabase類、CdaoTableDef類、CdaoRecordset類和CdaoQueryDef類,而這四個類的定義和實現都包括在標頭檔案afxdao.h中,因此,在新定義的類的標頭檔案中一定要加上語句:

#include < afxdao.h >;

---- 3、對要用到的四個類各宣告一個如下:

  CDaoDatabase* loc_pDataBase; CDaoTableDef* loc_pTable; CDaoRecordset loc_pRecordset; CDaoQueryDef* loc_pQueryDef;

---- 其中CdaoDatabase類、CdaoTableDef類和CdaoQueryDef類定義了物件指標,在使用時要先new,最後要delete。以CdaoDatabase類為例,在CdataBaseOperate類的建構函式中初始化物件指標 loc_pDataBase=new CDaoDatabase;在解構函式中要釋放該指標delete loc_pDataBase;

---- 三、在自定義的類中加入所需的函式和變數

---- 手工加入函式包括兩項工作,首先在標頭檔案中加入函式的宣告,然後,在實現檔案中加入函式的具體實現,宣告與實現一定要統一;

---- 使用嚮導加入函式和變數:

---- 1、在Workspace視窗選擇ClassView選項卡;

---- 2、在樹型類結構圖的要新增函式和變數的類上單擊滑鼠右鍵,如果加入成員函式則單擊Add Member Function,加入虛擬函式單擊Add Virtual Function,加入成員變數單擊 Add Member Variable;

---- 3、出現對話方塊後,填寫成員函式或變數的名稱、型別,系統會自動新增函式的宣告與實現;

---- 4、新增函式的具體操作,可以透過編輯程式碼進一步填寫;

---- 這些操作將會在Workspace視窗的ClassView選項中立即體現出來,並且,單擊ClassView中的相應函式就可進入該函式的實現部分,進行進一步編寫程式碼,如果做不到這一點,說明新增成員函式的操作有誤。

---- 下面以本應用程式為例,給出具體的表結構和幾個主要函式的實現,讀者可以根據自己的實際情況設計函式。

---- 本應用程式中的一個典型表的結構是:

序號 正題內容 難度係數 分值 答案 備註整型 字元型 長整型 雙精度 字元型 字元型

---- 開啟資料庫的函式實現如下:

if (!loc_pDataBase->IsOpen()) loc_pDataBase->Open( NULL, FALSE,
FALSE, SQL_DATABASE);

---- 該函式中用到了CdaoDatabase類的兩個函式IsOpen()和Open(NULL, FALSE, FALSE, SQL_DATABASE),因為已經宣告瞭該類的指標物件loc_pDataBase,所以可以直接呼叫CdaoDatabase類的函式。其中,Open()函式中的最後一個引數SQL_DATABASE在前面已經介紹過,透過他開啟相關的資料庫。

---- 由於程式中開啟表後,不僅要返回所有的記錄集,還用到返回滿足一定條件的記錄集,因此開啟表的函式除了帶入表名外還有一個引數難度係數,lNDXS=0時,選擇表中全部資料, lNDXS=1~n時,表示選擇難度係數=1~n的記錄。

bool CDataBaseOperate::OpenTable (CString strTableName,long lNDXS) { CString strFieldNumber; loc_pTable=new CdaoTableDef (loc_pDataBase); if (!loc_pTable->IsOpen()) loc_pTable->Open(strTableName); //開啟指定的表名 strFieldNumber.Format("%d",loc_pTable- > GetFieldCount()); //得到欄位數 CString Sqlstr,Sqlstr1,Sqlstr2; loc_pQueryDef=new CDaoQueryDef(loc_pDataBase); //得到查詢集和記錄集 if (lNDXS==0) { Sqlstr=_T(" * FROM "+strTableName); } else { Sqlstr1="SELECT * FROM "+strTableName ; Sqlstr2.Format("WHERE 難度係數= %d",lNDXS); Sqlstr=_T(Sqlstr1+Sqlstr2); } loc_pQueryDef->Create(NULL,Sqlstr); loc_pRecordset.Open(loc_pQueryDef); m_nRecordNumber=0; while(!loc_pRecordset.IsEOF()) { m_nRecordNumber++; loc_pRecordset.MoveNext( ); } return TRUE; }

---- 為了維護資料庫的,表用過後應該關閉,關閉表的同時,要釋放在開啟表的操作時初始化的物件指標,例如:delete loc_pQueryDef。同樣要注意,在建構函式中初始化的物件指標,在解構函式中一定要釋放。物件指標的初始化和釋放是成對出現的。

loc_pDataBase=new CDaoDatabase; //在建構函式中初始化物件指標。 delete loc_pDataBase; //在解構函式中釋放該物件指標。

---- 四、CdataBaseOperate類的應用

---- 1、使用VC++的嚮導生成一個應用程式,可以根據需要選擇基於對話方塊或是基於單、多文件,選擇單文件或多文件時不要選擇資料庫支援。

---- 2、在應用程式的主標頭檔案中加入#include "DataBaseOperate.h",並且還要宣告一個CdataBaseOperate類的物件,public: CDataBaseOperate m_CDataBaseOperate;

---- 3、有了指向CdataBaseOperate類的物件後,剛剛在CdataBaseOperate類中編制的函式都可以透過
"m_CdataBaseOperate .函式名"來呼叫。

小結:

---- 本文是VC++6.0下的CdataBaseOperate類建立與應用的一個初步探討,CdataBaseOperate類所實現的功能是很強大的。除了介紹的CdataBaseOperate類的幾個基本而又常用的函式之外,CdataBaseOperate還有很多用於其他方面的功能函式,在此不一一介紹。CdataBaseOperate類的函式,實現了資料庫內容的顯示、修改、新增、刪除等功能,基本上滿足了資料庫操作人員的需要。除了這些,程式設計人員還可以根據程式的需要定義自己的特有的函式。

---- 本文所提供的程式均在VC++ 6.0中編譯透過。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-981856/,如需轉載,請註明出處,否則將追究法律責任。

相關文章