Delphi 嵌套TClientDataSet的性能问题

Delphi 嵌套TClientDataSet的性能问题,delphi,delphi-xe2,tclientdataset,Delphi,Delphi Xe2,Tclientdataset,我有一个应用程序,它使用客户机数据集作为内存表,并对从实验室仪器接收到的数据进行本地存档。随着时间的推移,我在这些客户机数据集中添加了一些字段,为了保持保存的数据的可访问性,我编写了一个小过程,它可以直接更新旧保存的文件。到目前为止,它一直运作良好。最近,我不得不使用嵌套的数据集,我试图更改代码以迭代嵌套的数据集并更新它们。到目前为止,我提出的代码是: procedure UpdateCDS(NewCDS: TClientDataSet; const OldFileName: string);

我有一个应用程序,它使用客户机数据集作为内存表,并对从实验室仪器接收到的数据进行本地存档。随着时间的推移,我在这些客户机数据集中添加了一些字段,为了保持保存的数据的可访问性,我编写了一个小过程,它可以直接更新旧保存的文件。到目前为止,它一直运作良好。最近,我不得不使用嵌套的数据集,我试图更改代码以迭代嵌套的数据集并更新它们。到目前为止,我提出的代码是:

procedure UpdateCDS(NewCDS: TClientDataSet; const OldFileName: string);
  procedure InternalUpdateCDS(NewCDS, OldCDS: TClientDataSet);
  var
    i, j: Integer;
    NewNestedCDS, OldNestedCDS: TClientDataSet;
  begin
    OldCDS.First;
    while not OldCDS.Eof do
    begin
      NewCDS.Append;
      for i := 0 to NewCDS.FieldDefs.Count - 1 do
        if NewCDS.Fields[i].FieldKind = fkData then
          for j := 0 to OldCDS.Fields.Count - 1 do
            if UpperCase(NewCDS.Fields[i].FieldName)
              = UpperCase(OldCDS.Fields[j].FieldName) then
            begin
              if not OldCDS.Fields[j].IsNull then
                if OldCDS.Fields[j].DataType <> ftDataSet then
                  NewCDS.Fields[i].Value := OldCDS.Fields[j].Value
                else
                begin
                  NewNestedCDS := TClientDataSet.Create(nil);
                  try
                    OldNestedCDS := TClientDataSet.Create(nil);
                    try
                      OldNestedCDS.DataSetField :=
                        TDataSetField(OldCDS.Fields[j]);
                      NewNestedCDS.DataSetField :=
                        TDataSetField(NewCDS.Fields[i]);
                      OldNestedCDS.Open;
                      NewNestedCDS.Open;
                      InternalUpdateCDS(NewNestedCDS, OldNestedCDS);
                    finally
                      OldNestedCDS.Free;
                    end;
                  finally
                    NewNestedCDS.Free;
                  end;
                end;
              Break;
            end;
      NewCDS.Post;
      OldCDS.Next;
    end;
    NewCDS.MergeChangeLog;
  end;

var
  OldCDS: TClientDataSet;
begin
  OldCDS := TClientDataSet.Create(nil);
  try
    OldCDS.LoadFromFile(OldFileName);
    InternalUpdateCDS(NewCDS, OldCDS);
  finally
    OldCDS.Free;
  end;
end;
procedure-UpdateCDS(NewCDS:TClientDataSet;const-OldFileName:string);
过程InternalUpdateCDS(新CD、旧CD:TClientDataSet);
变量
i、 j:整数;
NewNestedCD,OldNestedCD:TClientDataSet;
开始
旧CD。首先;
而不是旧CD.Eof do
开始
NewCDS.Append;
对于i:=0到NewCDS.FieldDefs.Count-1 do
如果NewCDS.Fields[i].FieldKind=fkData,则
对于j:=0到oldcs.Fields.Count-1 do
if大写(NewCDS.Fields[i].FieldName)
=大写(oldcs.Fields[j].FieldName),然后
开始
如果不是OldCDS.Fields[j].IsNull,则
如果OldCDS.Fields[j].数据类型为ftDataSet,则
NewCDS.Fields[i].Value:=oldcs.Fields[j].Value
其他的
开始
NewNestedCDS:=TClientDataSet.Create(nil);
尝试
OldNestedCDS:=TClientDataSet.Create(无);
尝试
OldNestedCDS.DataSetField:=
TDataSetField(oldcs.Fields[j]);
NewNestedCDS.DataSetField:=
TDataSetField(NewCDS.Fields[i]);
旧的CD。打开;
新嵌套的CD。打开;
内部更新CD(新嵌套CD、旧嵌套CD);
最后
旧的CD。免费的;
结束;
最后
免费的;
结束;
结束;
打破
结束;
NewCDS.Post;
下一步;
结束;
NewCDS.MergeChangeLog;
结束;
变量
OldCDS:TClientDataSet;
开始
OldCDS:=TClientDataSet.Create(nil);
尝试
LoadFromFile(OldFileName);
内部更新CD(新CD、旧CD);
最后
旧光盘。免费;
结束;
结束;

我的问题是,这个代码太慢了。对于1000条记录,在我的intel T7500上大约需要10秒。有没有更快的方法更新客户数据集?

@KenWhite想怎么做就怎么做,我不同意,但我没有时间和意愿去质疑它。@Fabriciaraujo:两位独立的主持人同意了,这不是一个讨论论坛。如果您愿意这样做,请根据网站指南对主持人的决定提出上诉。@KenWhite:正如我所说,我会的。但是现在我没有时间也没有精力,因为我已经检查了薄薄的时间片,我必须回答问题…我建议您分析代码。