Форум: "Базы";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Внизinceremental fetch tclientdataset баг? Найти похожие ветки
← →
_jk_ (2004-08-24 14:55) [0]Привет всем.
натолкнулся на ситуацию не знаю как самому справится :((
есть база оракл9и (важно) в ней есть таблица atab с полем afield
в таблице много записей с повторяющмися(важно) значениями в поле afield
в приложении открывается запрос
"select * from atab order by afield"
через TDataSetProvider в клиентдатасете используется PacketRecords=50 (фетчим по 50 записей, FetchOnDemand=true)
клиентдатасет подвязан в гриду.
так вот при открытии запроса фетчится 50 записей, скроллим грид кнопкой вниз, датасет фетчит еще несколько раз по 50 записей и потом вдруг перестает фетчить, якобы уже конец таблицы :((, на самом деле он зафетчил только 150 записей :(, далее если я нажму в гриде "вверх", а потом опять "вниз" - он продолжает фетчить оставшиеся записи... версия midas.dll 7.1.1692.668 (самая последняя вроде)
вот собствено проблема.
далее мой анализ ситуации:
при открытии запроса - открывается набор даныых где есть ряд записей (95 записей) с одинаковвым значением поля afield="ммм", когда клиентдатасет фетчит их - то он фетчит сначала часть из них,
при скроллинге вниз, он фетчит оставшуюся часть этих записей и вызывается метод TCustomClientDataSet.AddDataPacket
который вызывает уже midas.dll -
FDSBase.AppendData(VarToDataPacket(Data), HitEOF)
так вот "прикол" в том что этот метод добавляет данные НЕ В КОНЕЦ датасета, а в середину - как раз туда где начинается ряд записей с afield="ммм", а грид такого финта не замечает и сам clientdataset возращает Eof после такого финта %-(
кстати если поставить PacketRecords=96 (на 1 больше чем кол-во записей с одинковым значением поля) то глюка нет! но беда в том что я не могу знать зараннее сколько там таких записей есть, и подсчиттывать это тоже не карсиво...
на других субд(файрберд, мсскл) такого глюка не обнаружено - все работает четко.
никто с таким глюком не сталкивался?
← →
_jk_ (2004-08-24 16:33) [1]нашел закономерность...
дело в том что значение идут не совсем одинаковые, они отличаются регистром. т.о. при открытии запроса из dbexplore, оракл возращает след. набор данных
AAAA
AAAA
AAAA
AAAA
aaaa
aaaa
aaaa
aaaa
а при открытии в клиент датасете получается след. картина:
1. фетчатся записи в с заглавными буквами:
АААА
АААА
АААА
АААА
АААА < курсор
2. При зачитывании записей с маленькими буквами они вставляютсяне в конец (как их вернул оракл) а вперед:
аааа
аааа
аааа
аааа < вставка
аааа
АААА
АААА
АААА
АААА
АААА < курсор
и после этого клиентдатасет возращает Eof, пока его не передернешь в гриде вверх вниз...
и почему клиент датасет не так возращает данные как оракл?
ЗЫ. возможно и под другими субд есть что нить похожее - просто на своих тестах у меня были не одинаковые данные...
← →
_jk_ (2004-08-24 16:42) [2]в предидущей мессаге надо читать так:
... При зачитывании записей с маленькими буквами они вставляются НЕ в конец (как их вернул оракл) а вперед...
← →
roottim © (2004-08-25 08:08) [3]а локальные индексы тут не причем?
← →
_jk_ (2004-08-27 18:38) [4]а нету в момент глюка в клиентдасете локальных индексов %-(
← →
_jk_ (2004-09-14 10:50) [5]разобрался!
все дело в провайдере, точнее в его опциях -
надо вклюить флаг poRetainServerOrder и тогда клиент датасет не будет заниматься фигней.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.10.10;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.033 c