2014-09-28 3 views
-1

Я хочу создать функцию, которая использует TADOQuery и к которой я могу передать инструкцию select, она, в свою очередь, будет извлекать результаты из базы данных и возвращать результаты как TListВозврат TList из TADOQuery

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; 

Обратите внимание, что функция является общей, поэтому нельзя «жестко закодировать» ResultList.

Является ли вышеуказанное достижимым?

+1

TList представляет собой набор указателей, что бы ваш ожидаемый результат или то, что ваше намерение? – bummi

+0

По крайней мере, вы должны сообщить нам, какое поле вы хотите в своем списке. –

+0

@Jens Borrisholt. Функция должна быть общей, чтобы возвращаемые поля зависели от предоставленного выбора. – 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;