我有一个与存储过程连接的TADODataSet,它产生40列* 800行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个模块使用相同的方式…
请帮帮忙。
发布于 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输出也很慢。您没有显示导出的任何代码,但可能会有一些重要的优化可能性。在开始重构所有东西之前,对代码的各个部分做一些分析以找出实际的瓶颈总是很好的。
发布于 2012-11-28 22:35:42
我以前用过这种技术--对你有帮助吗?我可以看到输出的长度是一个问题,但您也许能够以某种方式提取它。也许可以看看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;https://stackoverflow.com/questions/13605901
复制相似问题