TClientDataSet的使用技巧
|
|
|
作者:佚名
来源:InterNet 加入时间:2007-1-26 |
在三层结构中,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 后设置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,使用右键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,实现自动容错和负载平衡
[文章录入员:nancy] |
|
|
|
|