Как реализовать транзакции в Access? - PullRequest
2 голосов
/ 25 января 2010

Я застрял при реализации функции транзакции / отката в форме доступа.

Вот урезанный план того, что я сделал:

В обработчике загрузки формы я запускаю транзакцию

dbEngine.BeginTrans
gInTransaction = true

Затем есть кнопка «Отмена», чей обработчик кликов выглядит как

dbEngine.Rollback
gInTransaction = false
doCmd.close acForm, "frmName"

Наконец, обработчик выгрузки формы имеет:

if gInTransaction then
    dbEngine.CommitTrans
    gInTransaction = false ' just in case
end if

Теперь, похоже, нет никакого влияния на форму в отношении отката. Нажатие кнопки «Отмена», похоже, ничего не откатывает.

Я также пытался заменить dbEngine на dbEngine.workspaces (0), но безрезультатно.

Итак, вопрос: как реализовать транзакцию в Access?

Спасибо за любой указатель в правильном направлении, Rene

Ответы [ 4 ]

1 голос
/ 25 января 2010

Я не думаю, что вы можете реализовать транзакции в форме, где обновления производятся в наборе записей (с событиями beforeUpdate и afterUpdate), а транзакция связана с выполнением команды INSERT, UPDATE или DELETE, отправленной в базу данных.

РЕДАКТИРОВАТЬ: если ваша идея состоит в том, чтобы иметь возможность управлять всеми изменениями, внесенными в непрерывную форму, у вас есть 2 различных решения:

  1. Первый - прикрепить отключил набор записей ADODB к вашему сформировать и вызвать «batchUpdate» метод, как только все ваши изменения было сделано. Хотя я не проверял док, я думаю, ты сможешь ловить исключения, которые могут произойти в этот этап через соединение объект.
  2. Второй способ, который мы реализуем в наших приложениях, заключается в том, чтобы клиент работал с копией исходных данных. На стороне клиента мы отслеживаем все вставки, удаления и обновления, сделанные в форме. Как только пользователь проверяет свои изменения, клиент генерирует «на лету» набор инструкций SQL, соответствующих внесенным изменениям, и отправляет их в базу данных. Затем очень легко отправить эти инструкции в транзакции (одна транзакция на строку или одна для всех изменений). Нам потребовалось некоторое время, чтобы настроить это решение, но оно того стоило. Проверка формы теперь является уникальной функцией, используемой в каждой форме наших приложений. Функция даже разрешает проверку «от одной формы до нескольких таблиц».
0 голосов
/ 26 января 2010

Исследуя эти транзакции, я нашел эту ссылку многообещающей:

http://support.microsoft.com/kb/248011

Тем не менее, похоже, есть и другие проблемы с ним.

0 голосов
/ 26 января 2010

I опубликовал пример кода для использования транзакций в Access чуть более недели назад, но он не предназначен для работы с данными, отредактированными в связанной форме. По сути, с связанными формами у вас нет того же контроля, который вы делаете через другие интерфейсы. Это и особенность, и недостаток, в зависимости от того, что вы пытаетесь сделать.

0 голосов
/ 25 января 2010

Я согласен с Шахкалпешем, что обновления формы не будут частью транзакции. Вы можете заставить свою форму делать это, вместо того чтобы использовать связанную форму, используя несвязанную форму, чтобы иметь контроль над завершением ввода-вывода.

Вы можете сделать это несколькими способами, но я предпочитаю загружать детали в форму загрузки и затем иметь кнопку сохранения, которая запускает подпрограмму, которая сохраняет эти данные обратно в БД. Я также обычно устанавливаю вызов публичной переменной bDirty и изменяю его на true, если когда-либо элемент управления недатирован, так что вы можете предупредить пользователя, если он попытается закрыть форму перед сохранением изменений

...