Могу ли я получить все записи из одного определенного поля с помощью одной команды?
У меня есть база данных *.mdb. Задача состоит в том, чтобы получить все значения из определенного поля этой базы данных и записать их в файл. Теперь код выглядит примерно так
while not ADOQuery1.Eof do begin
resultstringlist.add(ADOQuery1.FieldByName('_fieldname_').asString);
ADOQuery1.next;
end;
Это работает, но я думаю, что есть более оптимальный и быстрый вариант. При размере базы данных около 40000 записей этот процесс занимает довольно много времени. База данных, с которой мне нужно работать, содержит в десятки раз больше записей и десятки таблиц. Я думаю, что это довольно глупый вопрос, но я сам не смог найти решение за несколько дней. Базы данных для меня это неизведанная территория. Надеюсь, ненадолго.
1 ответ
Не использовать FieldByName
в тесной петле, он выполняет линейный поиск по набору данных Fields
на каждый звонок. Вместо этого найдите поле перед циклом и присвойте результат локальной переменной TField и получите доступ к значению поля в цикле, используя эту переменную. Итак, используйте что-то вроде
var AField : TField;
...
AField := ADOQuery1.FieldByName('_fieldname_');
ADOQuery1.DisableControls;
try
while not ADOQuery1.Eof do begin
resultstringlist.add(AField.asString);
ADOQuery1.next;
end;
finally
ADOQuery1.EnableControls;
end;
Призывы к DisableControls
а также EnableControls
Избегайте замедления цикла, обновляя все элементы управления графическим интерфейсом с поддержкой db, подключенные к AdoQuery.
Вы также можете привыкнуть звонить BeginUpdate
а также EndUpdate
на любых объектах, происходящих из TStrings, при их обновлении в тесном цикле.