Вниз
Скачать: CL | DM;

Странное поведение в 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 вся ветка

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.024 c
3-1074854595
Asdor
2004-01-23 13:43
2004.03.28
dbExpress и MSSQL


1-1078731479
Hunter
2004-03-08 10:37
2004.03.28
Explorer


14-1078218503
Cobalt
2004-03-02 12:08
2004.03.28
Интересный проект - неинтересный проект


1-1078517175
ArtAlex_
2004-03-05 23:06
2004.03.28
Защищенные документы


7-1073988533
LexusU
2004-01-13 13:08
2004.03.28
Чтение запись регистров CMOS в WinXP/Win2K




   Наверх