云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > ado数据库编程

ado数据库编程

  • 62 次阅读
  • 3 次下载
  • 2025/5/4 14:42:41

}//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\

搜索更多关于: ado数据库编程 的文档
  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

}//while() f.close(); 12. 使用safearray问题 学会使用safearray也是非常重要的,因为在ado编程中经常要用。他的主要目的是用于automation中的数组型参数的传递。因为在网络环境中,数组是不能直接传递的,而必须将其包装成safearray。实质上safearray就是将通常的数组增加一个描述符,说明其维数、长度、边界、元素类型等信息。safearray也并不独立使用,而是将其再包装到variant类型的变量中,然后才作为参数传送出去。在variant的vt成员的值如果包含vt_array│...,那么他所封装的就是个safearray,他的parray成员即是指向safearray的指针。safearray中元素的类型能是variant能封装的所有类型,包括variant类型本身。

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com