【问题标题】:Returning a TList from a TADOQuery从 TADOQuery 返回 TList
【发布时间】:2014-09-28 06:51:36
【问题描述】:

我希望创建一个使用 TADOQuery 的函数,并且我可以将 select 语句传递给该函数,它将依次从数据库中获取结果并将结果作为 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;

请注意,该函数是通用函数,因此不能“硬编码” ResultList。

以上可以实现吗?

【问题讨论】:

  • TList 是指针的集合,您的预期结果是什么或您的意图是什么?
  • 至少你应该告诉我们你想要在你的列表中的哪个字段。
  • @Jens Borrisholt - 该函数应该是通用的,这样返回的字段取决于提供的 Select 语句。
  • 字段类型有哪些?例如,假设有一个字符串和 2 个整数。这些应该怎么收拾?该列表需要包含一些内容。
  • @bummi - 我的意图是有一个可以将数据集(TADOQuery)结果转换为列表的函数。该函数将是一个实用函数,因此不应将其绑定到特定表。

标签: delphi delphi-xe6


【解决方案1】:

您可以使用变体数组来存储一行的字段,并使用这些“行数组”的通用列表来保存这些。

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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多