2014-12-19 24 views
0

我有函數應該從FDQuery返回FDDataset,但我不能將數據集複製到Result或另一個FDDataset。 這是我的主要代碼:從Delphi中的函數複製並返回FDDataSet

procedure TForm1.Button1Click(Sender: TObject); 
var: Fix: TFDDataSet; 
begin 
Fix.CreateDataSet; 
Fix.CopyDataSet(getFix(1)); 
end; 

和功能在其他單位:

function getFix(id: Integer): TFDDataSet; 
begin 
FDQuery.SQL.Clear; 
FDQuery.SQL.ADD('SELECT ....'); 
... 
FDQuery.SQL.Open; 
Result.CreateDataSet; 
Result.CopyDataSet(FDQuery.Fields.DataSet); 
end; 

我得到錯誤: 「訪問衝突......」。

如何將FDQuery結果複製到另一個TFDDataSet?或者我應該使用TClientDataSet? FireDac與TClientDataSet是否有相同之處?

回答

2

代碼中有幾處錯誤需要糾正。

首先,看起來TFDDataSet是一個抽象類(至少它的一部分是),儘管在文檔中我沒有說明這一點。這意味着你無法按照你的想法創建和使用它。 (FireDAC的源代碼不包含在德爾福的專業SKU中,所以我不能在那裏確認。)

您可以使用TFDMemTable代替,如果您正確地創建並使用它,它將起作用。當一個函數的Result是一個對象實例,你必須先Create該對象實例,然後才能使用它:

function getFix(id: Integer): TFDMemTable; 
begin 
FDQuery.SQL.Clear; 
FDQuery.SQL.ADD('SELECT ....'); 
... 
FDQuery.Open; 
Result := TFDMemTable.Create(nil); 
Result.CopyDataSet(FDQuery.Fields.DataSet); 
end; 

BTW,你應該改變你的函數的名稱,提醒你,你也負責在使用它來避免內存泄漏之後釋放該數據集。正確使用的話,會是:

MyMemTable := getFix(SomeID); 
try 
    // Do something with MyMemTable 
finally 
    MyMemTable.Free; 
end; 
+0

我也嘗試這樣的,得到了​​「抽象錯誤」,並期待在這裏http://stackoverflow.com/a/18669138/2980912,所以也許我不能像這樣使用TFDDataSet?或者那並不重要? – Gem

+0

當您逐步完成代碼時,哪一行會導致Abstract Error? –

+0

行CreateDataSet和CopyDataSet會導致錯誤...我試圖傳遞該函數之外的FDQuery結果並從中解析值。我通過創建記錄(記錄數組)來做到這一點,但我被告知這是更好的方式,因爲排序和東西...也許有其他方式來做到這一點?調用該函數,查詢sql並返回結果以在另一個函數之外讀取它們?也許FDMemTable或ClientDataSet? – Gem