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 の Professional 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 に答える