分类:
2008-10-13 16:45:06
封装ADO之MFC应用
作者:
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();(六)指针的移动
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; };该结构用于支持其他操作。