我的函数应该从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有相同之处吗?
答案 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}}