You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi中实现类似PHP的MySQL查询结果数组存储?

嘿,刚好我经常用Delphi的FireDAC处理这类需求,给你一步步讲怎么实现和PHP类似的循环读数据存数组的逻辑!

首先,Delphi里的数据集(比如你用的FDQuery)和PHP的查询结果集逻辑类似,都是通过遍历记录来获取每一行数据。下面分几种常见场景给你示例:

1. 存储单个字段到字符串数组

如果只是像你示例里那样存value字段的字符串值,最简单的方式是用动态数组:

首先在单元的type部分定义数组类型(或者直接用Delphi内置的TArray<string>):

type
  TStringArray = array of string;

然后写核心逻辑:

var
  ValueArray: TStringArray;
  Index: Integer;
begin
  FDQuery1.SQL.Text := 'select * from `table` WHERE dcid=3;';
  FDQuery1.Open;
  try
    // 提前设置数组长度(如果确定RecordCount准确的话,效率更高)
    SetLength(ValueArray, FDQuery1.RecordCount);
    Index := 0;
    
    // 循环遍历所有记录
    while not FDQuery1.Eof do
    begin
      ValueArray[Index] := FDQuery1.FieldByName('value').AsString;
      Inc(Index);
      FDQuery1.Next; // 移动到下一条记录
    end;
  finally
    FDQuery1.Close; // 确保数据集关闭,释放资源
  end;

  // 测试输出到Memo
  Memo1.Clear;
  for Index := 0 to High(ValueArray) do
    Memo1.Lines.Add(ValueArray[Index]);
end;

如果不想依赖RecordCount(比如大数据集或者数据集不支持提前获取记录数),可以动态扩展数组:

var
  ValueArray: TStringArray;
begin
  FDQuery1.SQL.Text := 'select * from `table` WHERE dcid=3;';
  FDQuery1.Open;
  try
    while not FDQuery1.Eof do
    begin
      // 每次扩展数组长度+1
      SetLength(ValueArray, Length(ValueArray) + 1);
      // 取最后一个索引赋值
      ValueArray[High(ValueArray)] := FDQuery1.FieldByName('value').AsString;
      FDQuery1.Next;
    end;
  finally
    FDQuery1.Close;
  end;
end;

2. 存储整条记录到对象数组

如果要像PHP那样把整条记录存成对象,你可以先自定义一个类来对应表结构,再存到对象数组里:

// 先定义数据类,对应你的表字段
type
  TTableRecord = class
  public
    DCID: Integer;
    Value: string;
    // 这里可以添加表的其他字段,比如Name、CreateTime等
  end;

// 核心逻辑
var
  RecordArray: array of TTableRecord;
  CurrRecord: TTableRecord;
begin
  FDQuery1.SQL.Text := 'select * from `table` WHERE dcid=3;';
  FDQuery1.Open;
  try
    while not FDQuery1.Eof do
    begin
      CurrRecord := TTableRecord.Create;
      try
        // 给对象赋值
        CurrRecord.DCID := FDQuery1.FieldByName('dcid').AsInteger;
        CurrRecord.Value := FDQuery1.FieldByName('value').AsString;
        
        // 添加到数组
        SetLength(RecordArray, Length(RecordArray) + 1);
        RecordArray[High(RecordArray)] := CurrRecord;
      except
        // 如果赋值出错,要释放创建的对象避免内存泄漏
        CurrRecord.Free;
        raise;
      end;
      FDQuery1.Next;
    end;
  finally
    FDQuery1.Close;
  end;

  // 使用完数组后,记得释放所有对象!
  try
    for CurrRecord in RecordArray do
      CurrRecord.Free;
  finally
    SetLength(RecordArray, 0);
  end;
end;

3. 更推荐:使用泛型集合(Delphi XE及以上支持)

Delphi后期版本支持泛型集合,比如TList<T>,比手动管理动态数组更方便、更安全,不用手动处理数组长度,还自带很多实用方法:

// 需要引用System.Generics.Collections单元
uses
  System.Generics.Collections;

var
  ValueList: TList<string>;
begin
  ValueList := TList<string>.Create;
  try
    FDQuery1.SQL.Text := 'select * from `table` WHERE dcid=3;';
    FDQuery1.Open;
    try
      while not FDQuery1.Eof do
      begin
        // 直接Add,集合自动管理长度
        ValueList.Add(FDQuery1.FieldByName('value').AsString);
        FDQuery1.Next;
      end;
    finally
      FDQuery1.Close;
    end;

    // 转成数组的话,直接调用ToArray方法
    // var ValueArray: TArray<string> := ValueList.ToArray;
    
    // 遍历输出到Memo
    Memo1.Clear;
    for const S in ValueList do
      Memo1.Lines.Add(S);
  finally
    ValueList.Free; // 释放集合
  end;
end;

如果要存对象,用TList<TTableRecord>同样方便,而且遍历、查找、排序都很省心,记得最后释放集合里的对象和集合本身哦。

内容的提问来源于stack exchange,提问作者roozgar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:21:45