Проблема с MemTableEh.ApplyUpdates

Kuzya21
Дата: 02.06.2009 21:01:36
Вопрос к знатокам Ehlib.
Среда: Delphi 5 + MS SQL Server через BDE.

Используются компоненты MemTableEh + BDEDataDriver от Ehlib (4.2 – 4.4).
MemTable.CachedUpdates := TRUE;

Задача:
Обновить данные в транзакции. В случае непредвиденной ошибки откатить все изменения, но все данные оставить на экране для коррекции и повторной попытки сохранения.

Попробовал так:

try
DataBase1.StartTransaction;
MemTableEh.ApplyUpdates(0);
DataBase1.CommitTransaction;
except
DataBase1.RollbackTransaction;


Но, очевидно, функция ApplyUpdates в MemTableEh не рассчитана для работы в транзакции. Все изменения ДО ошибки считаются завершенными (выставляется UpdateStatus = usUnModified) и не участвуют в повторной транзакции.

Вопрос:
Нет ли какого то способа подружить MemTableEh.ApplyUpdates с транзакцией? Может, есть какие-то свойства-методы используемых компонентов для подобной ситуации?
На ум приходит только
1) предварительное копирование Memtable’а и возврат данных из копии при ошибке;
2) использование временных таблиц без всяких constraint’ов для минимизации вероятности ошибки и последующей заливке в статическую.
Нет ли какого-то более изящного решения?
Буду благодарен за любой совет.
Док
Дата: 03.06.2009 01:12:51
Kuzya21,

MemTableEh.CancelUpdates (если я правильно понял суть вопроса)
+ из справки

CancelUpdates – отменяет все отложенные изменения и восстанавливает старое состояние записей.
Kuzya21
Дата: 03.06.2009 07:51:25
Cancel Updates нельзя - он затирает ВСЕ изменения, а их может быть довольно много а нужно подправить возможно лишь одно поле в одной записи.

У TQuery есть одна удобная фишка. Нужно сначала сделать ApplyUpdates и потом CommitUpdates для фиксации изменений. А в MemTableEh.ApplyUpdates записи сразу же переводятся в usUnModified или удаляются из MemTable'а, не дожидаясь сохранения остальных записей.
Док
Дата: 05.06.2009 02:24:39
Kuzya21
Cancel Updates нельзя - он затирает ВСЕ изменения, а их может быть довольно много а нужно подправить возможно лишь одно поле в одной записи.

На руборде промелкнуло в постах (ссылаются на конфу Большакова), что последнее обновление эхлиба 4.4.52 как раз касаемы меморитабли, пофиксены какие-то баги. Я мельком глянул исходники, там в основном изменены pas-файлы MTE и DataDriver. Сам, правда, еще не ставил. Пробуй.
Vladislav Matvienko
Дата: 06.06.2009 00:04:36
Добрый день

Похоже, тоже сталкивался с проблемой в режиме кешированных обновлений, но в связке с TIBXDataDriverEh хотя думаю неважно, т.к. весь функционал там на уровне родительского DataDriver.
Сейчас уже деталей не помню - использовать кешированные обновления не стал, но сейчас хочу еще раз попробовать перейти на работу в этом режиме, так что тема поднята интересная.

Не удалось решить проблему?

Может ее обсудить на официальном форме EhLib? Как вижу EhLib вполне себе нормально развивается, обновления выходят. Большаков не сразу, но отвечает.

Док
На руборде промелкнуло в постах (ссылаются на конфу Большакова), что последнее обновление эхлиба 4.4.52 как раз касаемы меморитабли, пофиксены какие-то баги. Я мельком глянул исходники, там в основном изменены pas-файлы MTE и DataDriver. Сам, правда, еще не ставил. Пробуй.


В этой версии похоже этого нет. В этой версии, в том числе и с моей подачи Большаков несколько моментов поправил, но похоже этого там не было.