Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.013 c
1-43487
Rayslava
2004-02-27 18:57
2004.03.14
Позиция каретки в RichEdit


1-43643
snake1977
2004-03-02 08:43
2004.03.14
Паралельная работа с файлами


4-43946
yorik
2004-01-07 16:11
2004.03.14
Буфер


3-43327
чайник1
2004-02-17 11:28
2004.03.14
Резервное копирование


1-43550
Batoon
2004-02-27 17:30
2004.03.14
работа с LISTBOX ом





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский