扩展@Ravaut123 的答案,我建议使用以下代码:
确保您的 Query 没有连接到任何可视化的其他组件,并且没有设置任何在 rowchanges 上触发的事件,因为这将导致它更新活动记录中的每个更改,从而减慢速度。
您可以使用 禁用可视控件disablecontrols
,但不能禁用事件和非可视控件。
...
SQLatable:= 'SELECT SingleField FROM atable ORDER BY indexedfield ASC';
AQuery:= TAdoQuery.Create(Form1);
AQuery.Connection:= ....
AQuery.SQL.Text:= SQLatable;
使用查询确保您只选择 1 个字段,按照您想要的顺序,这减少了网络流量。一个表获取所有字段,导致更多开销。
function TForm1.LoadingAllIntoStringList(AQuery: TAdoQuery): TStringList;
var
Field1: TField;
begin
Result:= nil;
try
if not(AQuery.Active) then begin
AQuery.Open;
end else begin
AQuery.First;
end;
AQuery.DisableControls;
AQuery.Filtered:= false; //Filter in the SQL `where` clause
AQuery.FetchAll; //Preload all data into memory
Result:= TStringlist.Create;
except
{ignore error, will return nil}
end;
try
Result.Sorted:= false; //Make sure you don't enable sorting
Result.Capacity:= AQuery.RecordCount; //Preallocate the needed space
Field1:= AQuery.FieldByName('SingleField'); //Never use `fieldbyname` in a loop!
while not AQuery.EOF do begin
Result.Add(Field1.AsString);
AQuery.Next;
end; {while}
AQuery.EnableControls;
except
FreeAndNil(Result);
end;
如果要将数据加载到字符串列表中进行一些处理,请考虑在 SQL 语句中执行此操作。数据库可以使用字符串列表无法使用的索引和其他优化。
如果您想将该数据保存到 CSV 文件中,请考虑为此使用内置 DB 函数。
例如 MySQL 有:
SELECT X FROM table1 INTO OUTFILE 'c:/filename_of_csv_file.txt'
这将为您创建一个 CSV 文件。
许多数据库具有类似的功能。