2012-11-28 15 views
1

我有一個存儲過程連接的TADODataSet即產生40列* 800行 的TADODataSet具有分配OnGetText它的AfterOpen事件是場 這樣的:如何TADODataSet與字段文本不是場出口值

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

你見過['這example'(http://www.swissdelphicenter.ch/torry/showcode.php?id=1498)? – TLama

+1

是@TLama,但這不會導出字段的文本...因爲我重寫字段的OnGetText事件我想要提供的文本不是值...您的示例只導出來自來自Server引擎,並且不會接受onGetText事件中提供的文本值。 – user1512094

+0

沒有辦法做到這一點沒有循環TDataSet AFAIK。 [這個例子](http://www.swissdelphicenter.ch/en/showcode.php?id=772)可能會有所幫助。 – kobik

回答

0

由於您不想做太多的改變,因此您無法優化此功能。我希望你可以優化這個:如果你的數據集有固定的字段(在設計時添加),你可以使用通常命名爲DataSetNameFieldName的組件字段(例如cdsEmployeeEMPNO)引用該字段。

如果是這種情況,您可以參考cdsEmployeeEMPNO.AsString(或您需要的任何屬性)。 這個速度更快的原因是因爲在這種情況下使用的字段組件已經知道它引用了哪個字段。

在你的情況下,你使用按名稱查找:if Sender.DataSet.FieldByName('RelStoreId').AsString= .. 這意味着每一次,代碼執行DataSet.Fields.IndexOf(FieldName)。這是一個緩慢的查找,因爲這些字段沒有排序或任何東西。考慮到你的數據集的大小,這可能是成千上萬的這樣的查找,如果你做得更聰明,它可以容易地快兩倍。

如果由於某種原因,你不能使用這些磁場分量包裝,也可以進行查詢一次,保存您在您的數據模塊的變量需要的字段的指標,並要求這樣的值:if Sender.DataSet.Fields[RelStoreIdIndex].AsString= 現在直接使用字段的索引,這可以節省查找時間。這會使它快一點。

但請注意,XML輸出速度也很慢。您不顯示任何導出代碼,但可能會有一些嚴重的優化可能性。在開始重構所有內容之前,對代碼的各個部分進行分析以查找實際瓶頸是很好的做法。

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; 
+0

和SaveToStream()當然 –

+0

這不會得到字段文本,但它只獲取不符合我的任何需求的字段值,因爲我使用OnGetText事件來處理文本的值並顯示另一個數據用戶使用字段的Text屬性。 – user1512094

+0

@ user1512094 - 我不明白。在您原來的問題中,您說'我想將數據導出到XML'。當你說'Fields Text'時,你的意思是FieldNames Only沒有數據嗎? –

相關問題