Форум: "Базы";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
ВнизПоследняя запись в dbExpress Найти похожие ветки
← →
den777 (2004-02-16 10:06) [0]При работе с базой через компоненты dbExpress, возникает одна интересная ситуация.
После перебора всех записей в Datasetе невозможно достучаться до последней записи.
Пример:
While not SqlQuery.Eof do
begin
... // какие-то операции совсеми записями
SqlQuery.Next;
end;
//необходимо отдельно обработать данные из последней записи
s:=SqlQuery.Fields[0].Asstring;
но SqlQuery.Fields[0].Asstring всегда вернет пустоту, причиной тому нижеприведенные строки
из файла SqlExpr.pas
3351 {When EOF is True we should not be calling into the driver to get Data}
3352 {Calc field not computed for the first record as EOF is True}
3353 if EOF = True then
3354 begin
3355 Result := False;
3356 Exit;
3357 end;
Кто может объяснить в чем тут логика.Ведь EOF говорит о том, что курсор стоит на последней записи, а не за последней и если убрать эти строки то данные из последней записи можно спокойно получить.
Но в силу определенных обстоятельств исправлять Delphiшные файлы не хочется. Кто может подсказать выход из ситуации или привести аргументы, что программисты из Borlanda сделали все правильно, буду благодарен.
← →
Desdechado (2004-02-16 11:35) [1]ты, наверно, используешь однонаправленный курсор, поэтому в этой ситуации EOF говорит о позиции ЗА последней записью.
Если хочешь позиционироваться НА последней, делай Last;
← →
den777 (2004-02-16 11:55) [2]Действительно я использую однонаправленный курсор. Но мне это и надо. Last на однонаправленном курсоре не пройдет. Но как я написал вначале, если убрать приведенные мною строки из SqlExpr.pas, то именно на однонаправленном курсоре все и работает так как надо. И еще в качестве примера(может быть неуместного): не знаю кеширует ли BDE при UniDirectional:=true данные, но до последней строки там достучаться всегда можно.
И еще:
> в этой ситуации EOF говорит о позиции ЗА последней записью.
откуда это взято.
← →
Nikolay M. (2004-02-16 12:13) [3]Наверное, дело все-таки в однонаправленности.
Допустим, ты стоишь на последней записи и EOF равно False.
Когда ты пытаешься сделать Next, данные пытаются зафетчиться с сервера, но данных больше нет и вернуться на последнюю строку тоже нельзя (курсор-то однонаправленный!), EOF выставляется в True, а в полях пустые данные. Логично?
← →
den777 (2004-02-16 12:26) [4]
> Когда ты пытаешься сделать Next, данные пытаются зафетчиться
> с сервера, но данных больше нет и вернуться на последнюю
> строку тоже нельзя (курсор-то однонаправленный!), EOF выставляется
> в True, а в полях пустые данные. Логично?
Все логично. Но почему бы не предположить другое развитие событий. При очередном Next (не fetch данных, а именно Next) однонаправленнй курсор видит, что находится на последней записи, выставляет EOF в TRUE и больше ничего не делает.Соответственно до последней записи достучаться можно. Тоже ведь логично.
И как объяснить, что если курсор находится за последней записью то данные всеже извлечь можно (смотрите пояснения к вопросу).
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.03.14;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.012 c