clientdataset 用法.docx

上传人:b****7 文档编号:9202294 上传时间:2023-02-03 格式:DOCX 页数:8 大小:18.44KB
下载 相关 举报
clientdataset 用法.docx_第1页
第1页 / 共8页
clientdataset 用法.docx_第2页
第2页 / 共8页
clientdataset 用法.docx_第3页
第3页 / 共8页
clientdataset 用法.docx_第4页
第4页 / 共8页
clientdataset 用法.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

clientdataset 用法.docx

《clientdataset 用法.docx》由会员分享,可在线阅读,更多相关《clientdataset 用法.docx(8页珍藏版)》请在冰豆网上搜索。

clientdataset 用法.docx

clientdataset用法

clientdataset用法

影响ClientDataSet处理速度的一个因素

TClientDataSet是Delphi开发数据库时一个非常好的控件。

有很强大的功能。

我常常用ClientDataSet做MemoryDataSet来使用。

还可以将ClientDataSet的数据保存为XML,这样就可以做简单的本地数据库使用。

还有很多功能就不多说了。

在使用ClientDataSet的过程中关于怎样提高处理速度这个问题,我就我个人的一点点体会和大家分享一下。

通常情况下我们一般都是用

...ClientDataSet-->DataSource-->DBComponent

这样的结构,处理数据的时候就直接操作ClientDataSet。

但是大多DBComponet都会立即响应ClientDataSet的变化。

如果你是向ClientDataSet中插入很多数据时候,DBComponent就要响应几次,而且响应过程根据不同的控件,速度,过程数量都不一样。

这样就影响了程序的执行效率。

所以在对ClientDataSet处理中,我是用ClientDataSet.DisableControls和ClientDataSet.EnableControls方法:

打开和关闭DBComponent与ClientDataSet的数据显示关系。

例如:

ClientDataSet..DisableControls;

...

forI:

=0to10000do

begin

ClientDataSet.Append;

...

ClientDataSet.Post;

end;

...

ClientDataSet.EnableControls

...

这样做以后你会发现处理速度比以前没有使用方法的时候有成倍的提高。

ClientDataSet的数据查找。

我所介绍的心得和技巧都是用ClientDataSet来做范例,也可以应用于其他的一些DataSet。

废话就不多说了。

我们还是先看代码,让后再总结。

1.Scanning扫描数据查找

这是最简单最直接也是最慢的一种方法,遍历所有数据:

procedureTForm1.ScanBtnClick(Sender:

TObject);

var

Found:

Boolean;

begin

Found:

=False;

ClientDataSet1.DisableControls;

Start;

try

ClientDataSet1.First;

whilenotClientDataSet1.Eofdo

begin

ifClientDataSet1.Fields[FieldListComboBox.ItemIndex].value=

SearchTextthen

begin

Found:

=True;

Break;

end;

ClientDataSet1.Next;

end;

Done;

finally

ClientDataSet1.EnableControls;

end;

ifFoundthenShowMessage(SearchText+

'foundatrecord'+IntToStr(ClientDataSet1.RecNo))

else

ShowMessage(ScanForEdit.Text+'notfound');

end;2.Finding寻找数据

最老,但是最快的查找方式。

使用FindKey/FindNearest来查找一条或多条符合条件的数据,当然待查找的Field必须是一个IndexField。

可以看出,这种基于Index的查找速度是非常快的。

procedureTForm1.FindKeyBtnClick(Sender:

TObject);

begin

Start;

ifClientDataSet1.FindKey([SearchText])then

begin

Done;

StatusBar1.Panels[3].Text:

=SearchText+

'foundatrecord'+

IntToStr(ClientDataSet1.RecNo);

end

else

begin

Done;

StatusBar1.Panels[3].Text:

=

SearchText+'notfound';

end;

end;procedureTForm1.FindNearestBtnClick(Sender:

TObject);

begin

Start;

ClientDataSet1.FindNearest([SearchText]);

Done;

StatusBar1.Panels[3].Text:

='Thenearestmatchto'+

SearchText+'foundatrecord'+

IntToStr(ClientDataSet1.RecNo);

end3.Going定位

GotoKey/GotoNearest与FindKey/FindNearest基本上没有什么区别。

它也是基于Index的查找。

唯一的区别就是在于你是怎么定义你的查找了。

代码上也有区别:

ClientDataSet1.SetKey;

ClientDataSet1.FieldByName(IndexFieldName).value:

=SearchText;

ClientDataSet1.GotoKey;

就相当于

ClientDataSet1.FindKey([SearchText]);

要用好这两种基于Index的查找,还需要了解ClientDataSet和Index机制。

这里就不详细说明Index机制。

一个基本的原则,要有Index,才能查找。

4.Locating查找数据

2,3两种查找方式都是基于Index的,但是在实际应用中,可能会查找IndexField以外的Field。

那我们就可以使用Locate。

但是查找速度是没有2,3两种快的。

比如:

如果你查找一条纪录9000/10000,Locate需要500ms,Scanning需要>2s,FindKey只要10ms(但是当你打开ClientData的时候,建立Index需要1s)。

procedureTForm1.LocateBtnClick(Sender:

TObject);

begin

Start;

ifClientDataSet1.Locate('Field1,Field2..',VarArrayOf['value1,value2..'],[])then

begin

Done;

StatusBar1.Panels[3].Text:

=

'Matchlocatedatrecord'+

IntToStr(ClientDataSet1.RecNo);

end

else

begin

Done;

StatusBar1.Panels[3].Text:

='Nomatchlocated';

end;

end;小结:

ClientDataSet提供了好多种查找数据的方法。

但是各自有其优缺点。

上面的例子中有Start;和Done,如果你有兴趣,可以加入计时点进行速度测试。

Scanning最简单,但是最慢,因为比较慢,还得使用ClientDataSet.DisableControls和ClientDataSet.EnableControls方法(我在前面一片文章讲过)。

Findkey/FindNearest(GotoKey/GotoNearest)代码多,但是非常快。

必须使用Index,不同的是Find需要的Index是必须建立好的,而Goto可以在第一次使用时建立Index。

Locate使用最方便,不需要Index,但是速度没有Find快在三层结构中,TClientDataSet的地位是不可估量的,她的使用正确与否,是十分关键的,

本文从以下几个方面阐述她的使用,希望对你有所帮助.

1.动态索引

procedureTForm1.DBGrid1TitleClick(Column:

TColumn);

begin

if(notcolumn.FieldisTblobfield)then//Tblobfield不能索引,二进制

ClientDataSet1.IndexFieldNames:

=column.Field.FieldName;

end;

2.多层结构中主从表的实现

设主表ClientDataSet1.packetrecord为-1,所有记录

设从表ClientDataSet1.packetrecord为0,当前记录

3.Taggregates使用

(1)在字段编辑中addnewfield类型为aggregates

后设置expression(表达试)

设置active:

=true即可

使用dbedit的field为前者即可

(2)使用Aggergates属性add设计表达试

调用

  showmessage(floattostr(ClientDataSet1.Aggregates.Count));

  showmessage(ClientDataSet1.Aggregates.Items[0].Value);

 

4.在单层数据库中不要BDE

使用ClientDataSet代替table,使用ClientDataSet的loadfilename装入cds

代替table的tablename的db或者dbf

原来的程序改造方法:

加一个ClientDataSet,使用右键assignlocatedata

后savetofile,再loadfromfile,后删除table

将原连table的datasource设为ClientDataSet

唯一注意的是:

要将midas.dll拷到system或者当前目录

5.三层结构的公文包的实现方法

同时设定1:

filename(*.cds)2.remoteserver

6.可以对data赋值(从另一个数据集取值)

ClientDataSet2.Data:

=ClientDataSet1.Data;

ClientDataSet2.Open;

或者

ClientDataSet2.CloneCursor(ClientDataSet1,true);

ClientDataSet2.Open;

7.附加数据取得

客户程序向应用服务器请求数据。

如果TClientDataSet的

FetchOnDemand属性设为True,

客户程序会根据需要自动检索附加的数据包如BLOB字段的值或嵌套表的内容。

否则,

客户程序需要显式地调用GetNextPacket才能获得这些附加的数据包。

ClientDataSet的packetrecords设置一次取得的记录个数

8.ClientDataSet与服务器端query连接方法

(1)sql内容为空

ClientDataSet1.Close;

ClientDataSet1.CommandText:

=edit1.Text;//即sql内容

ClientDataSet1.Open;

对于没有应用服务器设置filter如:

countrylike'A%'

filtered=true可实现sql功能

(2)有参数

如服务端query的sql为

select*fromanimals

wherenamelike:

dd

则:

客户端ClientDataSet

var

pm:

Tparam;

begin

ClientDataSet1.Close;

ClientDataSet1.ProviderName:

='DataSetProvider1';

pm:

=Tparam.Create(nil);

pm.Name:

='dd';

pm.DataType:

=ftString;

ClientDataSet1.Params.Clear;

ClientDataSet1.Params.AddParam(pm);

ClientDataSet1.Params.ParamByName('dd').AsString:

=edit1.Text;

ClientDataSet1.Open;

pm.Free;

end;9.数据的更新管理

(1)savepoint保存目前为止数据状态,可以恢复到这个状态

var

pp:

integer;

begin

pp:

=ClientDataSet1.SavePoint;

ClientDataSet1.Edit;

ClientDataSet1.FieldByName('姓名').asstring:

='古话';

ClientDataSet1.Post;

table1.Refresh;

end;

恢复点

ClientDataSet1.SavePoint:

=pp;

(2)cancel,RevertRecord

取消对当前记录的修改,只适合没有post的,如果post,调用

RevertRecord

(3)cancelupdate

取消对数据库所有的修改

(4)UndoLastChange(boolean),changecount

取消上一次的修改,可以实现连续撤消

参数为true:

光标到恢复处

false:

光标在当前位置不动

changecount返回修改记录的次数,一个记录修改多次,返回只一次

但UndoLastChange只撤消一次

10.可写的recno

对于Ttable和Tquery的recno是只读的,而TClientDataSet的recno可读可写

ClientDataSet1.recno:

=5;是设第五个记录为当前记录

11.数据保存

对于table使用post可更新数据

而ClientDataSet1的post只更新内存数据,要更新服务器数据要使用

ApplyUpdates(MaxErrors:

Integer),他有一个参数,是允许发出错误的

次数,-1表示无数次,使用simpleobjectbroker时常设为0,实现自动容错和负载平衡

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1