当前位置:首页 > ado数据库编程
}//while() f.close();
12. 使用safearray问题
学会使用safearray也是非常重要的,因为在ado编程中经常要用。他的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成safearray。实质上safearray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。safearray也并不独立使用,而是将其再包装到variant类型的变量中,然后才作为参数传送出去。在variant的vt成员的值如果包含vt_array│...,那么他所封装的就是个safearray,他的parray成员即是指向safearray的指针。safearray中元素的类型能是variant能封装的所有类型,包括variant类型本身。
使用safearray的具体步骤:
方法一:
包装一个safearray:
(1). 定义变量,如:
variant varchunk; safearray *psa;
safearraybound rgsabound[1];
(2). 创建safearray描述符:
uisread=f.read(bval,chunksize);//read array from a file. if(uisread==0)break;
rgsabound[0].celements =uisread; rgsabound[0].llbound = 0;
psa = safearraycreate(vt_ui1,1,rgsabound); (3). 放置数据元素到safearray:
for(long index=0;index if(failed(safearrayputelement(psa,&index,&bval[index]))) ::messagebox(null,\出毛病了。\提示\ } 一个一个地放,挺麻烦的。 (4). 封装到variant内: varchunk.vt = vt_array│vt_ui1; varchunk.parray = psa; 这样就能将varchunk作为参数传送出去了。 读取safearray中的数据的步骤: (1). 用safearraygetelement一个一个地读 byte buf[lisread]; for(long index=0;index ::safearraygetelement(varchunk.parray,&index,buf+index); } 就读到缓冲区buf里了。 方法二: 使用safearrayaccessdata直接读写safearray的缓冲区: (1). 读缓冲区: byte *buf; safearrayaccessdata(varchunk.parray, (void **)&buf); f.write(buf,lisread); safearrayunaccessdata(varchunk.parray); (2). 写缓冲区: byte *buf; ::safearrayaccessdata(psa, (void **)&buf); for(long index=0;index buf[index]=bval[index]; } ::safearrayunaccessdata(psa); varchunk.vt = vt_array│vt_ui1; varchunk.parray = psa; 这种方法读写safearray都能,他直接操纵safearray的数据缓冲区,比用safearraygetelement和safearrayputelement速度快。特别适合于读取数据。但用完之后不要忘了调用::safearrayunaccessdata(psa),否则会出错的。 13. 使用书签( bookmark ) 书签能唯一标识记录集中的一个记录,用于快速地将当前记录移回到已访问过的记录,及进行过滤等等。provider会自动为记录集中的每一条记录产生一个书签,我们只需要使用他就行了。我们不能试图显示、修改或比较书签。ado用记录集的bookmark属性表示当前 记录的书签。 用法步骤: (1). 建立一个variant类型的变量 _variant_t varbookmark; (2). 将当前记录的书签值存入该变量 也就是记录集的bookmark属性的当前值。 varbookmark = rst->bookmark; (3). 返回到先前的记录 将保存的书签值设置到记录集的书签属性中: // check for whether bookmark set for a record if (varbookmark.vt == vt_empty) printf(\\n\else rst->bookmark = varbookmark; 设置完后,当前记录即会移动到该书签指向的记录。 14、设置过滤条件 recordset对象的filter属性表示了当前的过滤条件。他的值能是以and或or连接起来的条件表达式(不含where关键字)、由书签组成的数组或ado提供的filtergroupenum枚举值。为filter属性设置新值后recordset的当前记录指针会自动移动到满足过滤条件的第一个记录。例如: rst->filter = _bstr_t (\姓名=赵薇 and 性别=’女’\); 在使用条件表达式时应注意下列问题: (1)、能用圆括号组成复杂的表达式 例如: rst->filter = _bstr_t (\姓名=赵薇 and 性别=’女’) or age<25\ 不过微软不允许在括号内用or,然后在括号外用and,例如: rst->filter = _bstr_t (\姓名=赵薇 or 性别=’女’) and age<25\ 必须修改为: rst->filter = _bstr_t (\姓名=赵薇 and age<25) or (性别=’女’ and age<25)\ (2)、表达式中的比较运算符能是like like后被比较的是个含有通配符*的字符串,星号表示若干个任意的字符。 字符串的首部和尾部能同时带星号* rst->filter = _bstr_t (\姓名 like *赵* \ 也能只是尾部带星号: rst->filter = _bstr_t (\姓名 like 赵* \ filter属性值的类型是variant,如果过滤条件是由书签组成的数组,则需将该数组转换为safearray,然后再封装到一个variant或_variant_t型的变量中,再赋给filter属性。 15、索引和排序 (1)、建立索引 当以某个字段为关键字用find方法查找时,为了加快速度能以该字段为关键字在记录集内部临时建立索引。只要将该字段的optimize属性设置为true即可,例如: prst->fields->getitem(\姓名\getitem(\ prst->find(\姓名 = 赵薇\...... prst->fields->getitem(\姓名\getitem(\prst->close(); 说明:optimize属性是由provider提供的属性(在ado中称为动态属性),ado本身没有此属性。 (2)、排序 要排序也非常简单,只要把要排序的关键字列表设置到recordset对象的sort属性里即可,例如: prstauthors->cursorlocation = aduseclient; prstauthors->open(\_variant_t((idispatch *) pconnection), adopenstatic, adlockreadonly, adcmdtext); ...... prst->sort = \姓名 desc, 年龄 asc\
共分享92篇相关文档