Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];

Вниз

Откат изменений в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.037 c
3-1090500136
Andrew
2004-07-22 16:42
2004.08.15
Эмуляция boolean полей


1-1091008645
Labert
2004-07-28 13:57
2004.08.15
TCriticalSection - вопрос чайника


4-1088666904
Wistler
2004-07-01 11:28
2004.08.15
Работа с пользователями в домени WinNT


14-1090820609
syte_ser78
2004-07-26 09:43
2004.08.15
Имя пашины и логин пользователя


6-1087293736
webpauk
2004-06-15 14:02
2004.08.15
Игры





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