如何在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
相关产品推荐
相关产品推荐

