Форум: "Базы";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Вниз
Странное поведение в TClientDataset Найти похожие ветки
← →
Desdechado © (2004-02-24 16:35) [0]Есть связка TSQLDataset-TDatasetProvider-TClientDataset-TDataSource
Выполняется некий запрос SELECT, результат которого модифицируется. Запрос сложный, поэтому обработка изменений делается через TDatasetProvider.BeforeUpdateRecord.
Вопрос в чем. Если запись изменилась, но не все поля, то в DeltaDS этого обработчика для неизмененных полей значение NewValue может быть либо unassigned, либо null. В связи с этим приходится каждый раз писать проверку, а не совпадает ли значение поля с OldValue, а требуется ли сохранение этих полей в БД и т.д.
Просто, если тупо брать Field.AsInteger (например), то преобразование от NULL приводит к 0 и затирает при сохранении старое значение.
Объясните кто-нибудь, зачем такие сложности в реализации поведения ClientDataSet. Ведь гораздо проще было бы, если бы NewValue содержал бы ВСЕГДА данные: если изменились - то новые, если не изменились - то старые.
Может, кто знает лучший способ проверок? Ссылочку киньте какую-нить.
← →
Nikolay M. © (2004-02-24 18:09) [1]
> Ведь гораздо проще было бы, если бы NewValue содержал бы
> ВСЕГДА данные: если изменились - то новые, если не изменились
> - то старые
Программисты в Борланде не дураки, они делают не как проще, а как правильно. Допустим, изменил ты в одной табличке на 50 полей одно-единственное поле. Тогда, по твоей логике, на сервер должен уйти немеряный запрос, который апдейтит все 50 полей вместо одного, единственно нужного.
Конечно, если я правильно понял вопрос...
← →
Desdechado © (2004-02-24 18:52) [2]Я запрос конструирую сам, поэтому что отправлять на сервер тоже решаю я. Я бы просто проверял, равны ли OldValue и NewValue, а так приходится еще анализ на пустоту встраивать :(
← →
Desdechado © (2004-02-25 11:41) [3]народ, ну поделитесь, кто как обходит эту проблему...
или все работают с однотабличными запросами?
или не пользуются ApplyUpdates?
← →
Asdor (2004-02-25 12:00) [4]Если не ошибаюсь (не очень хорошо помню - давно это было),
в DeltaDS при UpdateKind=ukModify содержаться по 2 записи на каждую измененную - одна - то, что было раньше, вторая - то, что изменилось.
При UpdateKind=ukDelete или ukInsert - на каждую меняющуюся запись в DeltaDS содержится по одной записи.
← →
Desdechado © (2004-02-25 12:51) [5]ну, это собственно и есть OldValue и NewValue
а NewValue содержит только те поля, в которых изменения были
← →
Desdechado © (2004-02-26 14:01) [6]посоветуйте что-нибудь, народ!
← →
Polevi © (2004-02-26 14:27) [7]а чем тебя "анализ на пустоту" так пугает ?
← →
Desdechado © (2004-02-26 19:05) [8]Да не пугает, просто у меня огромное количество кода переводится с БДЕ. А там поведение такое, как мне нравится - в новой версии записи хранятся ВСЕ поля, даже неизмененные.
А теперь придется перелопачивать все, проверять логику и поведение программ, да и вставлять везде вместо одной строчки присваивания кучу проверок не есть гуд :(
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.03.28;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.035 c