2009-09-30 1 views
5

У меня была программа Delphi 4, которую я разработал много лет назад, которая использовала Opus DirectAccess для последовательного поиска в базе данных Microsoft Access и получения желаемых записей. В Delphi 4 не было ADO, поэтому я использовал DirectAccess.Почему ADO Следующая обработка записей замедляется в Delphi?

Но теперь я обновлен до Delphi 2009 и преобразовал программу в использование ADO. Я обнаружил, что цикл через таблицу (около 100 000 записей) запускается так же быстро, как и в DirectAccess, но затем он начинает замедляться и становится медленнее и медленнее, когда он проходит через таблицу. Базовый цикл:

ArticlesTable.First; 
while not Cancel and not ArticlesTable.Eof do begin 

    (See if the current record has criteria desired) 
    (If so, process the record) 

    ArticlesTable.Next; 
end; 

В основном, это просто обработка записей последовательно с использованием метода .Next.

Так почему это замедляется, и как я могу перекодировать это, чтобы он не замедлялся?

ответ

10

Вы должны вызывать DisableControls для всех наборов данных ADO, если вы не используете элементы управления DB, находящиеся в наборе данных.

В противном случае скорость засасывает.

см. this article для деталей.

В качестве альтернативы, использовать внутренний лукаво свойство набора записей

while Not ADOQuery1.Recordset.EOF do 
begin 
    ADOQuery1.Recordset.Movenext; 
end; 
+0

Добавление "ArticlesTable.DisableControls;" перед «ArticlesTable.First»; исправлена ​​проблема. Отлично! Спасибо огромное! – lkessler

1

Кроме того, вы можете изменить CursorType свойство вашего компонента доступа (TADOTable/TADOQuery/...).

Попробуйте ctOpenForwardOnly to imporve performance; Возможно, вам нужно отключить DBGrid (если вы его подключили) и снова подключиться при выходе из цикла.

С уважением.

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^