@ Ravaut123の回答を拡張して、次のコードを提案します。
クエリが視覚的な他のコンポーネントに接続されていないこと、および行の変更時に発生するイベントが設定されていないことを確認してください。これにより、アクティブレコードのすべての変更で更新が行われ、処理速度が低下します。
を使用してビジュアルコントロールを無効にすることはできますが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ステートメントでそれを行うことを検討してください。DBは、stringlistでは使用できないインデックスやその他の最適化を使用できます。
そのデータをCSVファイルに保存する場合は、組み込みのDB関数を使用することを検討してください。
たとえば、MySQLには次のものがあります。
SELECT X FROM table1 INTO OUTFILE 'c:/filename_of_csv_file.txt'
これにより、CSVファイルが作成されます。
多くのDBには同様の機能があります。