2014-09-28 4 views
-1

TADOQuery를 사용하고 select 문을 전달할 함수를 만들려면 데이터베이스에서 결과를 가져 와서 결과를 TList로 반환합니다.TADOQuery에서 TList 반환

function GetList(SelectStatement : string) : TList; 
var 
    ResultList : TList; 
Begin 
    with ADOQuery do 
    Begin 
     close; 
     SQL.Clear; 
     SQL.Add(SelectStatement); 
     open; 
     //This is where am not sure 
     //Get the results and populate the ResultList 
    End; 

    Result := ResultList; 
End; 

이 함수는 generic이므로 ResultList를 "하드 코딩"할 수 없습니다.

위의 내용을 달성 할 수 있습니까?

+1

은 TList 무엇을 당신의 예상 결과 일 또는 당신의 의도는 무엇인가 것, 포인터의 모음입니다? – bummi

+0

적어도 당신은 당신이 당신의 목록에서 원하는 필드를 우리에게 말해야합니다. –

+0

@Jens Borrisholt -이 함수는 제공되는 Select 문에 따라 반환되는 필드가 일반화되어야합니다. – KE50

답변

3

변형 된 배열을 사용하여 한 행의 필드와 이러한 "행 배열"의 제네릭 목록을 저장하여이를 유지할 수 있습니다.

uses Generics.Collections; 
{$R *.dfm} 

Type 
    TVarArray = Array of Variant; 
    TVarList = TList<TVarArray>; 

Function GetAds2List(Ads:TAdoDataset):TVarList; 

    Function GetRow:TVarArray; 
    var 
    i: Integer; 
    begin 
     SetLength(Result, ADS.FieldCount); 
     for i := 0 to ADS.FieldCount - 1 do 
     begin 
     Result[i] := ADS.Fields[i].Value; 
     end;  
    end; 
begin 
    Result := TVarList.Create; 
    Ads.First; 
    While not ADS.Eof do 
    begin 
     Result.Add(GetRow); 
     Ads.Next; 
    end; 
end; 

사용 예제 :

procedure TForm3.Button1Click(Sender: TObject); 
var 
    l:TVarList; 
    I,J: Integer; 
    s:String; 
    Function sep(idx:Integer):String; 
    begin 
    if idx=0 then 
     Result := '' 
    else 
     Result := ' , ';  
    end; 
begin 
    ReportMemoryLeaksOnShutDown := true; 
    l := GetAds2List(Ads1); 
    for I := 0 to l.Count - 1 do 
     begin 
     s := ''; 
     for j := 0 to High(l[i]) do 
      begin 
      s := s + sep(j) + VarToStrDef(l[i][j],'*NULL*'); 
      end; 
     memo1.lines.add(s); 
     end;  
    l.Free; 
end;