Форум: "Базы";
Текущий архив: 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