从Delphi中的函数复制并返回FDDataSet

时间:2014-12-19 16:44:02

标签: delphi dataset tclientdataset delphi-xe7 firedac

我的函数应该从FDQuery返回FDDataset,但我无法将数据集复制到Result或另一个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有相同之处吗?

1 个答案:

答案 0 :(得分:3)

您的代码中有一些错误需要纠正。

首先,TFDDataSet似乎是一个抽象类(至少是它的一部分),尽管在我的文档中没有说明。这意味着您无法按照自己的意愿创建和使用它。 (FireDAC的来源并不包含在Delphi的专业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; 该对象实例才能使用它:

MyMemTable := getFix(SomeID);
try
  // Do something with MyMemTable
finally
  MyMemTable.Free;
end;
顺便说一句,您应该更改函数的名称,以提醒您在使用该数据集以避免内存泄漏后,您还要负责释放该数据集。那么,正确的用途是:

{{1}}