2014-12-19 29 views
0

FDQuery에서 FDDataset을 반환해야하지만 결과 또는 다른 FDDataset에 데이터 집합을 복사 할 수 없습니다. 내가 오류가FDDataSet을 복사하여 Delphi의 함수에서 반환

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

: "액세스 위반 ...."다른 장치에서

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

과 기능 : 이 내 주요 코드입니다.

다른 TFDDataSet에 FDQuery 결과를 복사하려면 어떻게해야합니까? 또는 TClientDataSet을 사용해야합니까? FireDac과 TClientDataSet가 같은가?

답변

2

수정해야 할 몇 가지 오류가 코드에 있습니다.

먼저, TFDDataSet은 내가 알 수있는 한 문서에 표시되어 있지 않지만 추상 클래스입니다 (적어도 그 일부는 있음). 이것은 당신이 원하는대로 그것을 만들고 사용할 수 없다는 것을 의미합니다. FireDAC의 소스는 Delphi의 Professional SKU에 포함되어 있지 않으므로 확인을 위해 볼 수는 없습니다.

TFDMemTable을 올바르게 생성하고 사용하면 올바르게 작동합니다.

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, 당신은 아마 당신은 또한 책임이 있음을 알려 함수의 이름을 변경해야합니다 : 함수의 Result는 개체 인스턴스 때, 당신은 당신이 그것을 사용하기 전에 객체 인스턴스 첫 번째 Create에 있습니다 메모리 누수를 피하기 위해 데이터 세트를 사용하면 해당 데이터 세트를 해제합니다. 적절한 사용은 다음과 같다 :

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

내가 그런 시도하고 "추상 오류"를 가지고 여기 http://stackoverflow.com/a/18669138/2980912 찾고 있었다 않았다, 그래서 어쩌면 내가 할 수 없습니다 이 TFDDataSet을 사용 하시겠습니까? 아니면 그건 중요하지 않니? – Gem

+0

코드를 단계별 실행하면 어떤 줄에서 추상 오류가 발생합니까? –

+0

CreateDataSet 및 CopyDataSet 오류가 발생합니다 ... 그 함수 외부에서 FDQuery 결과를 전달하고 값을 구문 분석하려고했습니다. 나는 레코드 (Record of Record)를 만들어서 만들었지 만, 이것이 정렬과 물건 때문에 더 좋은 방법이라고 들었습니다. 아마도 그럴 수있는 다른 방법일까요? 그 함수를 호출하고, sql을 쿼리하고, 결과를 다른 함수의 함수 밖에서 읽도록 결과를 얻으시겠습니까? 어쩌면 FDMemTable 또는 ClientDataSet입니까? – Gem