Главная страница
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.033 c
6-48667
ws
2003-07-11 11:16
2003.09.15
Помогите с ошибками сокетов, плиз!


1-48649
SiRex
2003-09-02 00:35
2003.09.15
Проблемка: RichEdit + Русские символы


1-48492
Igor__
2003-09-02 20:02
2003.09.15
Как узнать какие елементы выделены в ListView.


3-48396
vovan
2003-08-26 13:10
2003.09.15
результат Query


1-48584
Леша
2003-09-04 02:11
2003.09.15
Запретить Alt + F4 форме, а при нажатии на кнопку разрешить...