Главная страница
    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.45 MB
Время: 0.013 c
14-43843
Шишкин Илья
2004-02-24 18:15
2004.03.14
Java для Nokia


3-43282
NorthMan
2004-02-12 16:02
2004.03.14
В чем дело, почему BDE выдает ошибку


1-43652
Kair
2004-03-02 07:35
2004.03.14
Класс и объект


14-43780
Cerber
2004-02-18 16:39
2004.03.14
Работа в инте


3-43318
DimaF
2004-02-15 22:24
2004.03.14
TIBTable





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский