Могу ли я получить все записи из одного определенного поля с помощью одной команды?

У меня есть база данных *.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, при их обновлении в тесном цикле.

Другие вопросы по тегам