关闭

delphi中 clientdataset使用方法

2105人阅读 评论(0) 收藏 举报
分类:

1.基本情况介绍; clientdataset内存表,他的data属性存放的是数据, delta 增量记录的是日志, 就相当于数据库的 savepoint保存点;每当clientdataset的数据有变化时(onbeforeedit, onafteredit),savepoint都会变化。如果我们想取消一段时间的操作,我们可以先记录下这个savepoint,然后修改,如果想取消,直接让这个savepoint = 以前的那个点即可。

try this

var 
  BaseLine:Integer;
begin
  with ClientDataSet1 do
  begin
    BaseLine:=SavePoint;
    Insert;
    FieldByName('Name').AsString:= Edit1.Text;
    FieldByName('Weight').AsInteger:= StrToInt(Edit2.Text);
    if 提交 then
      MergeChangeLog
    else //取消
      SavePoint:=BaseLine;
  end;
end;

2. clientdaset可以不连接数据库直接使用,如果设置了clientdataset的filename属性,那么在数据集打开或者关闭的时候,都会将数据集里的数据保存到对应的文件中,这个过程是会合并日志的。也就是说你编辑到什么状态,然后下次打开还是什么状态。

3.mergechangelog; 就是将 delta里面的操作日志跟 data合并,

4.emptydataset,清空数据集。

5.三层服务的构造方法,在客户端放上clientdataset, 然后放上socketconnect; webconnection是不是也可以?然后将clientdataset的remoteserver 指向 socketserver; clientdataset的dataprovider设置为服务器上的datasetprovider 服务器上放上dataprovider即可。provide里面有个onrequest命令,可以接受客户端发过来的命令。

6.创建内存表:createdataset,创建数据集。

 //明细表内存对象创建
  with cdsDtl do
  begin
    with FieldDefs do
    begin
      Clear;
      //数据库字段
      Add('Num', ftString, 14, False);
      Add('Cls', ftString, 10, False);
      Add('Line', ftInteger, 0, False);
      Add('GDCode', ftString, 20, False);
      Add('sl', ftInteger, 0, False);
      Add('GID', ftInteger, 0, False);
      //ToDo 增加业务明细字段

      //辅助字段
      Add('GDName', ftString, 120, False);
      Add('Note', ftString, 255, False);
      Add('LSTINPRC', ftFloat, 0, False);
    end;
    IndexDefs.Add('','Line',[ixPrimary]);
    CreateDataSet;
    Append;
  end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  self.ds1.FieldDefs.Add('Name',ftString,50);
  self.ds1.FieldDefs.Add('Age',ftString,50);
  self.ds1.CreateDataSet;
  self.ds2.FieldDefs.Add('Name',ftString,50);
  self.ds2.FieldDefs.Add('Age',ftString,50);
  self.ds2.CreateDataSet;
 
  self.ds1.AppendRecord(['100','100']);
  self.ds1.AppendRecord(['100','100']);
  self.ds1.AppendRecord(['100','100']);
  self.ds1.AppendRecord(['100','100']);
  self.ds1.AppendRecord(['100','100']);
  self.ds1.AppendRecord(['100','100']);
  self.ds2.Data:=self.ds1.Delta;
end;


procedure TForm1.btn1Click(Sender: TObject);
begin
  self.ds1.AppendRecord(['1001','100']);//添加新纪录
  self.ds2.Data:=self.ds1.Delta;
end;

李维的书,有空还是看看吧。

提交数据的时候,记得applyupdates(-1,0.3),分别是提交正常的,不管不正常的了,0出错,允许3个出错。


如果我想要通过sql语句更新客户修改的数据,那么我们可以这样做

再放一个ClientDataSet2,用ClientDataSet2.Data=ClientDataSet1.Delta;
while not ClientDataSet2.Eof do
case  ClientDataSet2.UpdateStatus of
usDeleted:
XXX
通过将原 clientdataset里面的日志复制到另一个数据集,然后遍历记录,看看修改过的日志。就可以找到修改过的数据了。


Clientdataset在处理几千行数据还是很快的,要是处理上万行数据,是比较慢的。

ClientDataSet1.IndexFieldNames:='列1;列2'; 添加索引

if ClientDataSet1.FindKey([这里填什么?,X]) then 查找字段。

if ClientDataSet1.State in [DsEdit, DSInsert] then  ClientDataSet1.Post;
  if ClientDataSet1.ChangeCount > 0 then
    begin
    if ClientDataSet1.ApplyUpdates(0) = 0 then         ClientDataSet1.MergeChangeLog;
      end
    else
      abort;
    end
  else
    exit;
changecount,可以看出数据集是否有改动。

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:117781次
    • 积分:3256
    • 等级:
    • 排名:第10494名
    • 原创:214篇
    • 转载:21篇
    • 译文:1篇
    • 评论:3条
    最新评论