Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Откат изменений в ClientDataSet после вызова ApplyUpdates   Найти похожие ветки 

 
Delf ©   (2004-07-21 17:59) [0]

Столкнулся с такой проблемой. На форме есть два ClientDataSet:
cdsHead и cdsList и кнопка Save, на кнопке стоит следующий код


saveError:=False;
BeginTran;
saveError:=cdsHead.ApplyUpdates(0)<>0;
....
saveError:=cdsList.ApplyUpdates(0)<>0;
.....
if saveError then
RoollbackTran
else
CommitTran


Так вот когда успешно выполняется первый ApplyUpdates и возникает ошибка при вызове второго  ApplyUpdates транзакция откатывается  но cdsHead "думает" что все изменения в нем успешно сохранены в базе на сервере. Как мне откатать cdsHead чтоб при повторном вызове cdsHead.ApplyUpdates(0) сделанные изменения  записались в базу.


 
Курдль   (2004-07-21 21:55) [1]

Не знаю, прокатит ли это с ТClientDataSet, но с нормальными компонентами весь Ваш код можно заменить одной строкой:
DataBase.ApplyUpdates([cdsHead, cdsList]);


 
Delf ©   (2004-07-22 10:51) [2]


> Не знаю, прокатит ли это с ТClientDataSet, но с нормальными
> компонентами весь Ваш код можно заменить одной строкой:
> DataBase.ApplyUpdates([cdsHead, cdsList]);

Если использовать BDE то может и прокатит у меня используется ADO а там компонента  DataBase увы не предусмотрено


 
Курдль ©   (2004-07-22 10:54) [3]

А причем здесь тогда ТClientDataSet?
Вроде как у ADO есть ТADODataSet...


 
Johnmen ©   (2004-07-22 10:58) [4]

>Delf ©

Вопрос интересный. Особенно учитывая, что в MySQL нет транзакционного механизма...:)


 
Соловьев ©   (2004-07-22 10:59) [5]


> что в MySQL нет транзакционного механизма...:)

та вроде появились, а также и внешние ключи, и триггеры, и хп.


 
Johnmen ©   (2004-07-22 11:03) [6]

Да, я тоже слыхал, что вроде бы как бы в последней версии что-то такое есть...:)


 
Delf ©   (2004-07-22 11:21) [7]


> Вопрос интересный. Особенно учитывая, что в MySQL нет транзакционного
> механизма...:)

В место MySQL должно было быть MSSQL (не там галочку поставил )
прошу прощения


 
Johnmen ©   (2004-07-22 11:25) [8]

Тогда всё просто
try
 BeginTrans;
 ApplyUpdates;
 CommitTrans;
except
 RollbackTrans;
end;


 
Sandman25 ©   (2004-07-22 11:28) [9]

BeginTrans;
try
ApplyUpdates;
CommitTrans;
except
RollbackTrans;
end;


 
Delf ©   (2004-07-22 11:29) [10]


> Курдль ©   (22.07.04 10:54) [3]
> А причем здесь тогда ТClientDataSet?
> Вроде как у ADO есть ТADODataSet...

Так ТClientDataSet тем и хорош что все изменения в таблице сначала держит локально не затрагивая таблиц на сервере. А потом при вызове ApplyUpdates заганяет все изменения на сервер.


 
Соловьев ©   (2004-07-22 11:30) [11]


> [10] Delf ©   (22.07.04 11:29)

про кешированные изменения читал?


 
Delf ©   (2004-07-22 11:37) [12]


> Тогда всё просто
> try
>  BeginTrans;
>  ApplyUpdates;
>  CommitTrans;
> except
>  RollbackTrans;
> end;

Конечно просто если ClientDataSet один: если ApplyUpdates(0) возвратило ненулевое значение то откатываем транзакцию и набор даных возвращается в состояние которое было до вызова ApplyUpdates. А вот если  ApplyUpdates(0) возвратило значение 0 а откатать все равно надо по тому что произошла ошибка после вызова етого метода. На сервере изменения откатываются а в наборе даных нет.


 
Delf ©   (2004-07-22 11:46) [13]


> про кешированные изменения читал?

если речь про то что  ТADODataSet как-то может держать все изменения локально(в кеше), а потом все одним махом записывать на сервер а при откате транзакции  возвращатся в исходное состояние(какое было до на начала транзакции) то не читал

Буду признателен если хоть вкратце про это напишете или ссылку подбросите


 
Соловьев ©   (2004-07-22 11:56) [14]


> если речь про то что  ТADODataSet

TCustomADODataSet.UpdateBatch


 
Delf ©   (2004-07-22 12:14) [15]

Спасибо
> Соловьев ©

Прочитал я в дельфовском хелпе статейку "Using batch updates"
Почти то что надо
но в ClientDataSet есть событие BeforUpdateRecord которое возникает каждый раз когда набор данных пытается обновить запись на сервере. В это событие можна засунуть вызов процедуры которая и будет обновлять запись и/или что-то еще делать на сервере.
У меня так и сделано.
Так вот в  ADODataSet аналогичного события найти не могу, а мне кроме обновления записи надо еще в нескольких таблицах данные обновить в зависимости от содержимого этой записи.
Как быть в этом случае (не тригер же писать)?


 
sniknik ©   (2004-07-22 12:54) [16]

> но в ClientDataSet есть событие BeforUpdateRecord
может в DataSetProvider?

по вопросу
раз уж
> В место MySQL должно было быть MSSQL (не там галочку поставил )
> прошу прощения
то делай транзакцию на сервере, запросами
BEGIN TRANSACTION
ROLLBACK TRANSACTION
COMMIT TRANSACTION
и добавь ADOConnection если его нет (без него проблемы, с транзакциями тоже), у тебя в списке используемых его нет.

естественно все датасеты используемые в твоем механизме должны быть "посажены" на один коннект.



Страницы: 1 вся ветка

Текущий архив: 2004.08.15;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.045 c
4-1088605120
Paulik
2004-06-30 18:18
2004.08.15
Странность в работе с DLL под Delphi и Visual Basic


4-1080805108
shiller
2004-04-01 11:38
2004.08.15
Скрытие процесса в NT


4-1088752213
Pank
2004-07-02 11:10
2004.08.15
Модем


14-1091034050
Art_Z
2004-07-28 21:00
2004.08.15
Как завести анкету?


1-1090999769
Vedem
2004-07-28 11:29
2004.08.15
Компонент TListView