Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.02 c
1-48560
vaa
2003-09-01 19:38
2003.09.15
классы


14-48692
Grouzd[E]v
2003-08-24 18:38
2003.09.15
Будете смеятся: как работать с архивами??? - я еще новичок :(((


3-48464
Val
2003-08-22 13:22
2003.09.15
Работа с isql


7-48818
Kalifen
2003-07-01 19:09
2003.09.15
Контроль печати.


1-48499
Urvin
2003-09-02 18:47
2003.09.15
Как использовать WM_...




   Наверх