2011-10-24 5 views
2

D2010, Win7 64 비트. 안녕하십니까,- TDataSet에서 메모리를 비우는 방법?

다른 단추로 열리는 TDataSet을 처리해야하는 buttonClick 이벤트가 있습니다 ... GetDBGenericData.

GetDBGenericData 함수는 TDataSet을 반환합니다. 이 루틴은 기본적으로 tQuery 구성 요소를 사용하여 SQL 속성을 설정하고 엽니 다. 그런 다음 TDataSet을 내 buttonclick으로 반환합니다.

procedure TForm1.Button2Click(Sender: TObject); 
var 
DS : TDataSet; 
begin 

DS := TDataSet.Create(nil); 
DS := GetDBGenericData(dbSOURCE, 'LIST_ALL_SCHEMAS', []); 

while Not DS.EOF do 
    begin 
    ShowMessage(DS.FieldByName('USERNAME').AsString); 
    DS.Next; 
    end; 

DS.Close; 
DS.Free; 

내 문제는 - Understanding DS. 나는이 루틴에서 여기 그것을 만들고있다. 구성 요소를 가리키는 TDataSet에 "할당"하고 있습니다. 내가 그것을 해제하지 않으면 메모리 누수가 있습니다 (EurekaLog에 의해보고 됨). 내가 해방하면 다음에이 루틴을 실행할 때 AV가 생깁니다. (특히 GetDBGenericData 루틴 내부).

내가 무슨 일이 일어나고 생각하는 것은 반환되고있는 TDataSet의에 (복사 반대) DS가 효과 그래서,이 루틴 모두 DS를 해제하고, 할당지고 있다는 것입니다, 그리고 GetDBGenericData에있는 tQuery 나는 자유를한다.

어떻게 링크를 "끊고"내가 동적으로 생성하는 메모리와 관련된 메모리 만 삭제합니까?

감사합니다, GS 당신의 DS 변수가 GetDBGenericData에 의해 다른 TDataSet를 할당하는 경우

답변

4

, 당신이해야 어느 Create 또는 Free을. 기존 데이터 세트를 참조하기 위해 사용하고 있습니다.

procedure TForm1.Button2Click(Sender: TObject); 
var 
    DS : TDataSet; 
    UserNameField: TField; // Minor change for efficiency 
begin 
    DS := GetDBGenericData(dbSOURCE, 'LIST_ALL_SCHEMAS', []); 

    // Call FieldByName only once; no need to create or 
    // free this either. 
    UserNameField := DS.FieldByName('USERNAME'); 

    while not DS.Eof do 
    begin 
    ShowMessage(UserNameField.AsString); 
    DS.Next; 
    end; 

    // I'd probably remove the `Close` unless the function call 
    // above specifically opened it before returning it. 
    DS.Close; 
end; 
+0

그게 ... 고마워. – user1009073

관련 문제