Форум: "Базы";
Текущий архив: 2003.09.15;
Скачать: [xml.tar.bz2];
ВнизРабота 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c