| 
        
           
           
                    | 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]
 |   
                    |  |  |  |  |