如何使用字段文本而非字段值导出TADODataSet

时间:2012-11-28 13:14:40

标签: xml delphi tadodataset

我有一个TADODataSet与存储过程连接,产生40列* 800行 TADODataSet有一个AfterOpen事件,它为Field分配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个模块使用相同的方式......

请帮忙。

2 个答案:

答案 0 :(得分:0)

由于您不希望进行太多更改,因此无法对此进行优化。

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

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

在您的情况下,您使用名称查找:if Sender.DataSet.FieldByName('RelStoreId').AsString= .. 这意味着代码每次执行DataSet.Fields.IndexOf(FieldName)。这是一个慢查找,因为这些字段没有排序或任何东西。考虑到数据集的大小,这可能是数以千计的此类查找,如果您更聪明地执行,这可以轻松地快两倍。

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

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

答案 1 :(得分: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;