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

Вниз

Последняя запись в 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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.033 c
3-43388
Vetal
2004-02-13 16:47
2004.03.14
Почему очищается поле Connection при запуске Delphi в TADOxxx


1-43440
003
2004-02-29 23:51
2004.03.14
Rich Text Format


3-43326
Patrick
2004-02-17 10:04
2004.03.14
Вопрос по EhLib


7-43930
CC
2003-12-24 15:21
2004.03.14
сканирование рисунка


14-43860
Думкин
2004-02-21 06:03
2004.03.14
С днем рождения! 21 февраля.