Главная страница
    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.49 MB
Время: 0.035 c
3-1090365380
maniac
2004-07-21 03:16
2004.08.15
При Update добавляется новая запись


9-1083347204
wolf3d
2004-04-30 21:46
2004.08.15
Если кто знает об игре Crazy Plumber


14-1090946189
Кириешки
2004-07-27 20:36
2004.08.15
Улучшение внешнего вида программы


4-1088772281
Lin
2004-07-02 16:44
2004.08.15
Вопрос по DrawFrameControl


14-1090768954
квантум
2004-07-25 19:22
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский