Расширяя ответ @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. БД может использовать индексы и другие оптимизации, которые нельзя использовать в списке строк.
Если вы хотите сохранить эти данные в CSV-файле, рассмотрите возможность использования для этого встроенной функции БД.
например. MySQL имеет:
SELECT X FROM table1 INTO OUTFILE 'c:/filename_of_csv_file.txt'
Это создаст для вас файл CSV.
Многие базы данных имеют аналогичные функции.
person
Johan
schedule
08.12.2011
FieldByName('OriginalData')
. - person Arnaud Bouchez   schedule 07.12.2011Sorted := False
при добавлении строк, затем снова включите сортировку, если необходимо, в конце. - person Jerry Gagnon   schedule 07.12.2011