ado数据库编程.doc
《ado数据库编程.doc》由会员分享,可在线阅读,更多相关《ado数据库编程.doc(12页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、10、邦定数据定义一个绑定类,将其成员变量绑定到一个指定的记录集,以方便于访问记录集的字段值。(1). 从cadorecordbinding派生出一个类:class ccustomrs : public cadorecordbindingbegin_ado_binding(ccustomrs)ado_variable_length_entry2(3, advarchar, m_szau_fname, sizeof(m_szau_fname), lau_fnamestatus, false)ado_variable_length_entry2(2, advarchar, m_szau_lname
2、, sizeof(m_szau_lname), lau_lnamestatus, false)ado_variable_length_entry2(4, advarchar, m_szphone, sizeof(m_szphone), lphonestatus, true)end_ado_binding()public:char m_szau_fname22;ulong lau_fnamestatus;char m_szau_lname42;ulong lau_lnamestatus;char m_szphone14;ulong lphonestatus;其中将要绑定的字段和变量名用begin
3、_ado_binding宏关联起来。每个字段对应于两个变量,一个存放字段的值,另一个存放字段的状态。字段用从1开始的序号表示,如1,2,3等等。特别要注意的是:如果要绑定的字段是字符串类型,则对应的字符数组的元素个数一定要比字段长度大2(比如m_szau_fname22,其绑定的字段au_fname的长度实际是20),不这样绑定就会失败。我分析多出的2可能是为了存放字符串结尾的空字符null和bstr字符串开头的一个字(表示bstr的长度)。这个问题对于初学者来说可能是个意想不到的问题。cadorecordbinding类的定义在icrsint.h文件里,内容是:class cadorecor
4、dbindingpublic:stdmethod_(const ado_binding_entry*, getadobindingentries) (void) pure;begin_ado_binding宏的定义也在icrsint.h文件里,内容是:#define begin_ado_binding(cls) public: typedef cls adorowclass; const ado_binding_entry* stdmethodcalltype getadobindingentries() static const ado_binding_entry rgadobindinge
5、ntries = ado_variable_length_entry2宏的定义也在icrsint.h文件里:#define ado_variable_length_entry2(ordinal, datatype, buffer, size, status, modify)ordinal, datatype, 0, 0, size, offsetof(adorowclass, buffer), offsetof(adorowclass, status), 0, classoffset(cadorecordbinding, adorowclass), modify,#define end_ado
6、_binding宏的定义也在icrsint.h文件里:#define end_ado_binding() 0, adempty, 0, 0, 0, 0, 0, 0, 0, false;return rgadobindingentries;(2). 绑定_recordsetptr rs1;iadorecordbinding *picrs=null;ccustomrs rs;.rs1-queryinterface(_uuidof(iadorecordbinding), (lpvoid*)&picrs);picrs-bindtorecordset(&rs);派生出的类必须通过iadorecordbi
7、nding接口才能绑定,调用他的bindtorecordset方法就行了。(3). rs中的变量即是当前记录字段的值/set sort and filter condition:/ step 4: manipulate the datars1-fields-getitem(au_lname)-properties-getitem(optimize)-value = true; rs1-sort = au_lname asc;rs1-filter = phone like 415 5*;rs1-movefirst();while (variant_false = rs1-endoffile)pr
8、intf(name: %st %stphone: %sn, (rs.lau_fnamestatus = adfldok ? rs.m_szau_fname : ), (rs.lau_lnamestatus = adfldok ? rs.m_szau_lname : ),(rs.lphonestatus = adfldok ? rs.m_szphone : );if (rs.lphonestatus = adfldok)strcpy(rs.m_szphone, 777);testhr(picrs-update(&rs); / add change to the batchrs1-movenext
9、();rs1-filter = (long) adfilternone;.if (picrs) picrs-release();rs1-close();pconn-close();只要字段的状态是adfldok,就能访问。如果修改了字段,不要忘了先调用picrs的update(注意不是recordset的update),然后才关闭,也不要忘了释放picrs(即picrs-release();)。(4). 此时还能用iadorecordbinding接口添加新纪录if(failed(picrs-addnew(&rs).11. 访问长数据在microsoft sql中的长数据包括text、imag
10、e等这样长类型的数据,作为二进制字节来对待。能用field对象的getchunk和appendchunk方法来访问。每次能读出或写入全部数据的一部分,他会记住上次访问的位置。不过如果中间访问了别的字段后,就又得从头来了。请看下面的例子:/写入一张照片到数据库:variant varchunk;safearray *psa;safearraybound rgsabound1;/vt_array vt_ui1cfile f(h:aaa.jpg,cfile:moderead);byte bvalchunksize+1;uint uisread=0;/create a safe array to st
11、ore the array of bytes while(1)uisread=f.read(bval,chunksize);if(uisread=0)break;rgsabound0.celements =uisread;rgsabound0.llbound = 0;psa = safearraycreate(vt_ui1,1,rgsabound);for(long index=0;indexfields-getitem(photo)-appendchunk(varchunk); catch (_com_error &e)cstring str=(char*)e.description();:
12、messagebox(null,str+n又出毛病了。,提示,mb_ok mb_iconwarning);:variantclear(&varchunk);:safearraydestroydata( psa);if(uisreadfields-itemphoto-actualsize; long lisread=0;_variant_t varchunk;byte bufchunksize;while(lphotosize0)lisread=lphotosize=chunksize? chunksize:lphotosize;varchunk = m_precordset-fields-it
13、emphoto-getchunk(lisread);for(long index=0;indexlisread;index+) :safearraygetelement(varchunk.parray,&index,buf+index); f.write(buf,lisread);lphotosize-=lisread;/while()f.close();12. 使用safearray问题学会使用safearray也是非常重要的,因为在ado编程中经常要用。他的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成safearray。实
14、质上safearray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。safearray也并不独立使用,而是将其再包装到variant类型的变量中,然后才作为参数传送出去。在variant的vt成员的值如果包含vt_array.,那么他所封装的就是个safearray,他的parray成员即是指向safearray的指针。safearray中元素的类型能是variant能封装的所有类型,包括variant类型本身。 使用safearray的具体步骤:方法一:包装一个safearray:(1). 定义变量,如:variant varchunk;safearray *psa
15、;safearraybound rgsabound1;(2). 创建safearray描述符:uisread=f.read(bval,chunksize);/read array from a file.if(uisread=0)break;rgsabound0.celements =uisread;rgsabound0.llbound = 0;psa = safearraycreate(vt_ui1,1,rgsabound);(3). 放置数据元素到safearray:for(long index=0;indexuisread;index+) if(failed(safearrayputel
16、ement(psa,&index,&bvalindex):messagebox(null,出毛病了。,提示,mb_ok mb_iconwarning);一个一个地放,挺麻烦的。(4). 封装到variant内:varchunk.vt = vt_arrayvt_ui1;varchunk.parray = psa;这样就能将varchunk作为参数传送出去了。读取safearray中的数据的步骤:(1). 用safearraygetelement一个一个地读byte buflisread;for(long index=0;indexlisread;index+) :safearraygetelem
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ado 数据库 编程
限制150内