DELPHI ClientData使用详解

在三层结构中,TClientDataSet的地位是不可估量的,她的使用正确与否,是十分关键的,

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

1.动态索引

procedure TForm1.DBGrid1TitleClick(Column: TColumn);

begin

if (not column.Field is Tblobfield) then//Tblobfield不能索引,二进制

ClientDataSet1.IndexFieldNames:=column.Field.FieldName;

end;

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

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

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

3.Taggregates使用

(1)在字段编辑中add new field类型为aggregates

后设置 Exp ression

设置 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,使用右键assign locate data

后savetofile,再loadfromfile,后删除table

将原连table的datasource设为ClientDataSet

唯一注意的是:要将midas.dll拷到system或者当前目录

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

同时设定1:filename(*.cds)2.remote server

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 如:country like 'A%'

filtered=true可实现sql功能

(2)有参数

如服务端query的sql为

select * from animals where name like :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,实现自动容错和负载平衡