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

封裝ADO之MFC應用

編輯:關於VC++

Microsoft ActiveX Data Objects (ADO) 支持用於建立基於客戶端/服務器和 Web 的應用程序的主要功能。其主要優點是易於使用、高速度、低內存支出和占用磁盤空間較少。

本次封裝的CadoInterface類僅針對MFC的使用,目的是優化對ADO的操作,避免頻繁寫try catch(…)以及在連庫、開表、寫數據、讀數據等過程中一些重復性的工作。該類僅對一些常用的操作進行封裝,用戶可以根據需要進行修改和擴展。

封裝類主要包括:基本操作、增值操作、支持算法與支持結構。基本操作、增值操作、支持算法在AdoInterface.h與AdoInterface.cpp中聲明定義,支持結構在DataBelong.h中定義。

這裡主要介紹該類的應用,實現細節的說明在代碼中均有注釋。

一、封裝類的關系

圖一 封裝類關系圖,箭頭代表包含關系,用戶使用時只需包含界面文件AdoInterface.h

二、基本操作部分

(一)連接數據庫

CString Conn="provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb";
  myado.ConnecDataLibrary(Conn,"","");

本例連接了一個無密碼的Access庫,如用其他方式連接數據庫,用戶可自行更改連接字符串,或者以枚舉方式將多種連接方式封裝到本函數中。

(二)開表

myado.OpenSheet("select * from file");

用戶僅需給出開表條件即可,其他的枚舉參數均有默認值,如用戶需要以不同方式打開,則可以重新給定枚舉參數的默認值。

(三)關庫、關表

myado.CloseSheet();
  myado.CloseDataLibrary();

(四)返回指針

myado.GetConnPtr();
  myado.GetRecoPtr();

如用戶的需求超出本類提供的操作時,可以通過這兩個函數獲取_ConnectionPtr與_RecordsetPtr指針,調用ADO的操作。

(五)屬性判斷

myado.BOF();
  myado.adoEOF();

(六)指針的移動

5種基本的指針移動(包括:MoveFirst、MoveLast、MoveNext、MovePrevious與Move(long Num))。

(七)執行SQL語句

CString str="Delete from file where AGE=36";
  myado.Execute(str);

(八)獲得字段內容

_variant_t str;
  myado.GetCollect("NAME",str);
  CString name=str;

(九)刪除一條記錄

myado.Delet();

默認刪除當前記錄,用戶可根據需要修改枚舉參數。

三、增值操作部分

(一)追加一條新記錄

AddNewCode insert[3];
  insert[0].ColName="NAME";       insert[0].Value="插入一條新記錄";
  insert[1].ColName="AGE";       insert[1].Value=18;
  insert[2].ColName="TIME";       insert[2].Value="1999/9/9";
  myado.AddNewRecode(insert,3);

用戶需要確定向該條記錄的哪些字段添寫數據,然後根據字段的個數定義數組(AddNewCode為支持結構)。本函數需要兩個參數:支持結構的數組指針與添寫字段的個數。

(二)追加一條新記錄(擴展)

myado.AddNewRecodeEx2("FF,NAME,小數,NUM,AGE,TIME",-2.17,"查林傑",3.1415927,10,-18,"1995/6/9");

該函數采用了未定參數的形式(類似於CString中的Format()函數形式)。

第一個參數為要寫入字段的字段名,字段名要以字符串方式給出,字段名之間用逗號分開;後面的參數為賦值參數,要與前面的字段名一一對應,賦值方式參考應用舉例。

(三)獲取一條記錄的內容

_variant_t ColName[5];
  ColName[0]="ID";ColName[1]="NAME";ColName[2]="AGE";ColName[3]="TIME";ColName[4]="HF";
  _variant_t OutValue[5];
  CString id,name1,age,time,hf;
  myado.GetOneRecord(ColName,5,OutValue);
  id=OutValue[0];  name1=OutValue[1]; age=OutValue[2];  time=OutValue[3]; hf=OutValue[4];

該函數需要三個參數,第一參數要一個_variant_t數組,順序給定要獲取的字段名;第二個參數為要獲取字段的個數;第三個為出參,也要一個_variant_t數組,用來順序保存所獲取的數據。

(四)獲取一條記錄的內容(擴展)

long la=0,lb=0; double da=0,db=0; CString s1="",s2="";
  myado.GetOneRecordEx2("FF,NAME,小數,NUM,AGE,TIME",&da,&s1,&db,&la,&lb,&s2);

該函數采用了未定參數的形式(類似於CString中的Format()函數形式)。

第一個參數為要獲取字段的字段名,字段名要以字符串方式給出,字段名之間用逗號分開;後面的參數為接收變量的地址,要與前面的字段名一一對應,函數執行後,各接收變量中保存了所獲取的數據。

(五)查找

myado.Find("AGE=47");
  while(myado.FindNext())
  {
  ……
  }

查找包括Find與FindNext,這兩個方法經常配合使用。Find在查找到一個符合條件的記錄時就停止,FindNext會繼續向下查詢,直到記錄集的末尾。

(六)過濾

myado.Filter("AGE>25");

四、支持算法與支持結構

(一)萃取字段名的算法

void Ufo(CString InStr,vector& OutStr);

該算法用於支持其他操作,可將一個字符串中的所有字段名分離出來,按順序壓入出參OutStr中。

(二)萃取字段名與字段類型的算法

void GetNameandType(CString ColName,vector& OutVnt);

該算法用於支持其他操作,是上一個算法的擴展,在分離字段名的同時,獲取該字段的類型,並按順序一同壓入出參OutVnt中。

(三)字段名與的值的結構

struct AddNewCode
  {
  _variant_t ColName;
  _variant_t Value;
  };

該結構用於支持其他操作。

(四)字段名與類型的結構

struct FieldInfor
  {
  _bstr_t Name;
  DataTypeEnum Type;
  };

該結構用於支持其他操作。

五、用戶需作的基本操作

1、在工程的stdafx.h中導入msado15.dll;

2、管理COM服務器;

3、將AdoInterface.h、AdoInterface.cpp、DataBelong.h三個文件加在工程目錄下,包含AdoInterface.h;

六、結束語

以上是對這個封裝類的介紹,用戶可以根據自已的需要進行修改和擴展,如果想要隱藏實現細節也可將其做成COM組件,這樣使用起來更加靈活。希望它能給大家操作數據庫帶來方便或者一些啟示。

示例程序由Visual Studio.NET2003編譯,在Win2000下通過測試。

本文配套源碼

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