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,可以看出数据集是否有改动。