我有一个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个模块使用相同的方式......
请帮忙。
答案 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;