0

我的函数应该从 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 等效的功能?

4

1 回答 1

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;
于 2014-12-19T17:11:55.413 回答