Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.15;
Скачать: CL | DM;

Вниз

Работа c TADOQuery   Найти похожие ветки 

 
kuchumovkv ©   (2003-08-23 23:50) [0]

Господа, помогите разрешить вопрос. Работаю с TADOQuery, деляю "селектом" выборку из дбф-ки и загоняю компонентом в другую дбф-ку (предвосхищая вопросы - так наиболее удобно для решаемой задачи). Делаю

...
TADOQuery.ExecSQL;
...
TADOQuery.Open;
TADOQuery.First;
i:=0;
repeat
inc(i)
...
//Обработка текущей записи
...
TADOQuery.Next
until i=TADOQuery.RecordCount;

Для контроля прицепил прогресс-бар, и заметил, что с каждой записью скорость обработки уменьшается. Впечатление, что несмотря на .Next, курсор начинает пробегать каждый раз с начала рекордсета. Подскажите, в чем может быть причина. База на 50000 записей, и время обработки имеет значение.


 
Hawk2 ©   (2003-08-24 00:13) [1]

Где ты видел такой код?


 
Hawk2 ©   (2003-08-24 00:20) [2]

Во-первых нужно использовать экземпляр класса, а не сам клас, в во-вторых это обычно делается так:
...
ADOQuery.ExecSQL;
...
ADOQuery.Open;
ADOQuery.First;
while not ADOQuery.EOF do
begin
...
//Обработка текущей записи
...
ADOQuery.Next;
end;
ADOQuery.Close;


 
kuchumovkv ©   (2003-08-24 00:24) [3]

Hawk2 (c)

Этот код работает у меня на машине.() Может, есть более эффективный способ доступа к полям запроса? Подскажи.


 
kuchmovkv   (2003-08-24 00:30) [4]

Hawk2 (c)

Thanks. Класс в коде я указал условно, естественно, это экземпляр вроде ado_q: TADOQuery; А ты можешь объяснить мне в чем предпочтение стейтмента While...eof перед repeat, или, например, For?


 
Hawk2 ©   (2003-08-24 13:19) [5]

kuchumovkv © (24.08.03 00:24) [3] > Может, есть более эффективный способ доступа к полям запроса? Подскажи.
Смотря что тебе нужно сделать, может можно и через SQL.
kuchmovkv (24.08.03 00:30) [4]> А ты можешь объяснить мне в чем предпочтение стейтмента While...eof перед repeat, или, например, For?
Если разбирать твой код то получается что вот в этом месте until i=TADOQuery.RecordCount; ты все время подсчитываешь количество записей в Квере, а если как ты сказал их у тебя 50000, то понятно почему падает скорость. В крайнем случае нужно было объявить переменную и присвоить ей количество записей:
ADOQuery.ExecSQL;
...
ADOQuery.Open;
ADOQuery.First;
rc:=ADOQuery.RecordCount;i:=0;
repeat
inc(i)
...
//Обработка текущей записи
...
TADOQuery.Next
until i=rc;
Но если нужно "пробежаться" по наборе данных (или файле) то правильнее всего использовать while ... do и функцию EOF (End Of File) которая проверяет когда достигнут конец НД (или файла) и ничего ненадо вычислять.


 
MsGuns ©   (2003-08-24 15:44) [6]

Var
RecCnt: Integer;

...
TADOQuery.ExecSQL;
...
TADOQuery.Open;
TADOQuery.Last;
RecCnt=TADOQuery.RecordCount;

TADOQuery.First;
i:=0;
repeat
inc(i)
...
//Обработка текущей записи
...
TADOQuery.Next
until i =RecCnt;



Страницы: 1 вся ветка

Текущий архив: 2003.09.15;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
6-48668
M@mbet
2003-07-13 20:03
2003.09.15
Копирование текста в TWebBrowser


3-48407
Igor Mish
2003-08-26 10:42
2003.09.15
Обновление базы Дом <-> Работа


1-48639
DeScriptor
2003-09-03 01:33
2003.09.15
Проблемы с юнитами


1-48542
Сергей Непочатов
2003-09-02 09:57
2003.09.15
Найти рабочий лист Excel


1-48571
RIPer
2003-09-04 11:21
2003.09.15
Печать документа Word