zoukankan      html  css  js  c++  java
  • 转 TClientDataSet的地位

    原文连接

    http://www.delphibbs.com/keylife/iblog_show.asp?xid=27416

    在三层结构中,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,实现自动容错和负载平衡  

  • 相关阅读:
    Codeforces 414A
    使用Homebrew在Mountain Lion上安装MySQL
    hdu2066:一个人的旅行(最短路)
    hdu2066:一个人的旅行(最短路)
    hdu1297:Children’s Queue(大数递推)
    hdu1297:Children’s Queue(大数递推)
    hdu1175: 连连看(bfs)
    hdu1175: 连连看(bfs)
    PID72 / 拔河比赛 (动态规划)
    PID72 / 拔河比赛 (动态规划)
  • 原文地址:https://www.cnblogs.com/carcode/p/1776277.html
Copyright © 2011-2022 走看看