1

我有一个 TADODataSet 与一个存储过程连接,它产生 40 Columns * 800 Row TADODataSet 有一个 AfterOpen 事件,它为其分配一个 OnGetText 字段如下:

procedure TForm1.ADODataSet1AfterOpen(DataSet: TDataSet);
begin
  with DataSet do 
  begin
    Fields[4].DisplayLabel:=TR(AS2); //RefId
    Fields[4].DisplayWidth:=8;
    Fields[4].Tag:=1;
    Fields[4].OnGetText:=RefGetText;

    Fields[5].DisplayLabel:=TR(AS3); //ClientId
    Fields[5].DisplayWidth:=8;
    Fields[5].Tag:=1;
    Fields[5].OnGetText:=ClientGetText;
  end;
end;


procedure TForm1.RefGetText(Sender: TField; var Text: String; DisplayText:   Boolean);
begin
  if Sender.DataSet.FieldByName('RelStoreId').AsString='' then
    Text:='NO REF ID'
  else
    KHDM.RefGetText(Sender,Text,DisplayText);
end;

procedure TForm1.ClientGetText(Sender: TField; var Text: String; DisplayText:   Boolean);
begin
  if Sender.DataSet.FieldByName('ClientId').AsString='' then
    Text:='Client ID is not Assigned'
  else
    KHDM.ClientGetText(Sender,Text,DisplayText);
end;

我想将数据导出到带有文本的 XML 我不想在字段和记录上进行循环,因为它非常慢我想要像批量复制这样的东西来流式传输或类似的东西

我无法改变我的工作方式,因为大约有 800 个模块使用相同的方式......

请帮忙。

4

2 回答 2

0

由于您不想进行太多更改,因此您无法做太多优化。

我希望您可以对此进行优化:如果您的数据集具有固定字段(在设计时添加),您可以使用组件字段引用该字段,该字段通常命名为 DataSetNameFieldName,(例如 cdsEmployeeEMPNO)。

如果是这种情况,您可以参考cdsEmployeeEMPNO.AsString(或您需要的任何属性)。这更快的原因是因为您在这种情况下使用的字段组件已经知道它引用了哪个字段。

在您的情况下,您使用名称查找:if Sender.DataSet.FieldByName('RelStoreId').AsString=.. 这意味着每次,代码都会执行DataSet.Fields.IndexOf(FieldName). 这是一个缓慢的查找,因为这些字段没有排序或任何东西。鉴于您的数据集的大小,这可能是数千个这样的查找,如果您做得更聪明,速度很容易翻倍。

如果由于某种原因,您不能使用这些字段组件包装器,您也可以执行一次查找,将所需字段的索引存储在数据模块中的变量中并请求如下值:if Sender.DataSet.Fields[RelStoreIdIndex].AsString= 您现在使用字段的索引直接,这会保存查找。这将使它更快一点。

但是请注意,XML 输出也很慢。您没有显示任何导出代码,但也许那里可能存在一些严重的优化可能性。在开始重构所有内容之前,最好对代码的各个部分进行一些分析以找到实际的瓶颈。

于 2012-11-28T13:51:14.630 回答
0

我以前使用过这种技术 - 对你有帮助吗?我可以看到输出的长度是一个问题,但你可能会以某种方式解决它。也许看看 ClientDataset.SavetoFile() 方法

function DataSetToXml(const ADataSet : TOraQuery) : String;
var
  Provider : TDataSetProvider;
  ClientDataSet : TClientDataset;
begin
  Provider := TDataSetProvider.Create(nil);
  try
    Provider.Name := 'tmpProvider';
    Provider.DataSet := ADataSet;
    ClientDataSet := TClientDataSet.Create(nil);
    try
      ClientDataSet.Data := Provider.Data;
      Result := ClientDataSet.XMLData;
    finally
      FreeAndNil(ClientDataSet);
    end;
  finally
    FreeAndNil(Provider);
  end;
end;
于 2012-11-28T14:35:41.523 回答