Delphi ADO Query - PullRequest
       54

Delphi ADO Query

8 голосов
/ 22 февраля 2010

Есть ли более быстрый способ перебора набора данных ADO, чем

while (not ADOQuery1.Eof) do
    begin
      /* Do something */
      ADOQuery1.Next;
    end;

Мне нужно отсканировать набор данных из примерно 9000 элементов и извлечь только те записи, которые соответствуют заранее определенному набору номеров ветвей.

Ответы [ 6 ]

10 голосов
/ 22 февраля 2010

Убедитесь, что вы используете DisableControls / EnableControls, если нет необходимости не тратить время на обновление видимых элементов управления, связанных с DataSet.

try
  ADOQuery1.DisableControls;
  while (not ADOQuery1.Eof) do
    begin
      /* Do something */
      ADOQuery1.Next;
    end;
finally
  ADOQuery1.EnableControls;
end;

Привет.

8 голосов
/ 22 февраля 2010

@ Питер, два варианта

1) вы можете изменить предложение sql перед выполнением, добавив условие where, которое соответствует предварительно определенному набору номеров ветвей.

2) с использованием свойства Filter TAdoQuery.

AdoQuery1.close;
AdoQuery1.filter := 'your condition goes here';
AdoQuery1.filtered := true;
AdoQuery1.Open;
7 голосов
/ 22 февраля 2010

Гораздо быстрее использовать ADORecordset для таких задач:

 while not ADOQuery1.Recordset.EOF do
  begin
    ADOQuery1.Recordset.MoveNext;
    // get value
    SomeVar := ADOQuery1.Recordset.Fields['FieldName'].Value;  
  end;
0 голосов
/ 05 мая 2013

Материал Delphi ADO (TADOQuery или TADOTable) не плохой, он ужасный (проверено с Delphi XE2 / 2007). Экспортировал данные из таблиц Transbase (драйвер ODBC) в MySQL через файлы sql и Navicat. Для таблицы с почти миллионом записей это займет много часов через ADO (таблица с 8 миллионами записей была выполнена на 10% через 2 дня), несколько минут с использованием TQuery (но может произойти сбой из-за ошибок BDE с большими таблицами, BDE не обновлялся последние 15 лет), несколько минут через чистый ODBC или Navicat. Мой совет: используйте что-нибудь вместо ADO (по крайней мере, пока серьезно не переработано разработчиками).

0 голосов
/ 23 февраля 2010

Возможно, вы захотите изменить запрос, включив в него выражение SQL where, что-то вроде

Select whatever fields From whatevertable
where branchnumber in (
    select branchnumber from whatevertable where branchid=xxz
)

Я бы также настоятельно рекомендовал использовать курсоры только для чтения вперед и только для чтения, чтобы добиться наибольшего увеличения скорости.

0 голосов
/ 22 февраля 2010

Дополнительный прирост производительности можно получить, избегая любых сравнений строк до как можно более позднего времени (когда все остальное совпадает). Если в вашей базе данных имеется большое количество повторяющихся строк, рассмотрите возможность размещения строк в отдельной таблице, связанной с первой таблицей целым числом.

...