![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Последняя запись в dbExpress
den777 © (2004-02-16 10:06:00)
При работе с базой через компоненты 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 сделали все правильно, буду благодарен.
den777 (2004-02-16 12:26:00) [1]
> Когда ты пытаешься сделать Next, данные пытаются зафетчиться
> с сервера, но данных больше нет и вернуться на последнюю
> строку тоже нельзя (курсор-то однонаправленный!), EOF выставляется
> в True, а в полях пустые данные. Логично?
Все логично. Но почему бы не предположить другое развитие событий. При очередном Next (не fetch данных, а именно Next) однонаправленнй курсор видит, что находится на последней записи, выставляет EOF в TRUE и больше ничего не делает.Соответственно до последней записи достучаться можно. Тоже ведь логично.
И как объяснить, что если курсор находится за последней записью то данные всеже извлечь можно (смотрите пояснения к вопросу).
Nikolay M. (2004-02-16 12:13:00) [2]
Наверное, дело все-таки в однонаправленности.
Допустим, ты стоишь на последней записи и EOF равно False.
Когда ты пытаешься сделать Next, данные пытаются зафетчиться с сервера, но данных больше нет и вернуться на последнюю строку тоже нельзя (курсор-то однонаправленный!), EOF выставляется в True, а в полях пустые данные. Логично?
den777 (2004-02-16 11:55:00) [3]
Действительно я использую однонаправленный курсор. Но мне это и надо. Last на однонаправленном курсоре не пройдет. Но как я написал вначале, если убрать приведенные мною строки из SqlExpr.pas, то именно на однонаправленном курсоре все и работает так как надо. И еще в качестве примера(может быть неуместного): не знаю кеширует ли BDE при UniDirectional:=true данные, но до последней строки там достучаться всегда можно.
И еще:
> в этой ситуации EOF говорит о позиции ЗА последней записью.
откуда это взято.
Desdechado (2004-02-16 11:35:00) [4]
ты, наверно, используешь однонаправленный курсор, поэтому в этой ситуации EOF говорит о позиции ЗА последней записью.
Если хочешь позиционироваться НА последней, делай Last;