首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用字段文本而不是字段值导出TADODataSet

如何使用字段文本而不是字段值导出TADODataSet
EN

Stack Overflow用户
提问于 2012-11-28 21:14:40
回答 2查看 520关注 0票数 1

我有一个与存储过程连接的TADODataSet,它产生40列* 800行TADODataSet有一个AfterOpen事件,它为它分配了一个OnGetText字段,如下所示:

代码语言:javascript
复制
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个模块使用相同的方式…

请帮帮忙。

EN

回答 2

Stack Overflow用户

发布于 2012-11-28 21:51:15

因为你不想做太多的改变,所以你不能做太多的优化。

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

如果是这种情况,您可以引用cdsEmployeeEMPNO.AsString (或您需要的任何属性)。这样做速度更快的原因是,您在本例中使用的字段组件已经知道它引用的是哪个字段。

在您的示例中,使用按名称查找:if Sender.DataSet.FieldByName('RelStoreId').AsString=..这意味着代码每次都会执行DataSet.Fields.IndexOf(FieldName)。这是一个很慢的查找,因为这些字段没有排序。给定您的数据集的大小,这可以是数千个这样的查找,如果您更智能地进行查找,速度很容易翻一番。

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

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

票数 0
EN

Stack Overflow用户

发布于 2012-11-28 22:35:42

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

代码语言:javascript
复制
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;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13605901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档