Обход транзакции для регистрации - PullRequest
0 голосов
/ 13 июля 2020

Я импортирую данные из Excel в Access. Во время импорта я проверяю его и вставляю только те строки, которые в порядке. Ошибки записываются в другую таблицу, которая позже используется в отчете. Импорт выполняется вручную с помощью макроса VBA. Я использую CurentDb.OpenRecordset для записи.

Текущее решение: только действительные данные + ведение журналов

  • Я импортирую данные из Excel построчно и сохраняю их в базе данных после импорта. Даже если я найду ошибки в других строках.
  • Одновременно я записываю ошибки в другую таблицу.

Желаемое решение: все или ничего + вести журналы

  • Зафиксировать импортированные данные, только если все данные действительны.
  • Сохранять журнал ошибок также при откате импортированных данных для отображения отчета.

Проблема

Когда я откатываю импортированные данные, журналы также откатываются, поэтому я не могу использовать их для отчетов.

Вопрос

Есть ли способ обойти транзакцию импорта, чтобы журнал всегда написано?

1 Ответ

1 голос
/ 14 июля 2020

Вы можете создать несколько рабочих пространств и соответствующих объектов базы данных, которые имеют отдельные транзакции, даже в базе данных, которая в настоящее время открыта. Обратите внимание, что это не сработает, если у вас есть эксклюзивная блокировка базы данных.

Dim wsLog As DAO.Workspace
Dim wsImport As DAO.Workspace
Dim dbImport As DAO.Database
Dim dbLog As DAO.Database
Dim dbe As DAO.DBEngine
Set dbe = DBEngine
Set wsLog = dbe.CreateWorkspace("wsLog", "Admin", "")
Set wsImport = dbe.CreateWorkspace("wsImport", "Admin", "")
Set dbLog = wsLog.OpenDatabase(CurrentProject.FullName)
Set dbImport = wsImport.OpenDatabase(CurrentProject.FullName)
wsImport.BeginTrans
dbImport.Execute "INSERT INTO Table1(Field1) VALUES(1)" 'Do your imports/processing in this workspace
wsLog.BeginTrans
dbLog.Execute "INSERT INTO Table2(Field1) VALUES(1)" 'And logging here
wsLog.CommitTrans 'Commit log
wsImport.Rollback 'Rollback import afterwards
'Result: Table2 is changed, Table1 isn't

Обратите внимание, что, хотя не требуется, использовать отдельную базу данных журналов, если вы используете Access для хранилище, я рекомендую его.

И, как сказано в комментариях, вы также можете просто работать с временной таблицей.

Вы создаете постоянно невидимую таблицу, предназначенную для временного использования, используя CreateTableDef с константой dbHiddenObject:

CreateTableDef("TableName", dbHiddenObject)

Он не будет удален автоматически, поэтому в этом смысле он не временный. И имейте в виду, что удаление + воссоздание временных таблиц увеличит размер базы данных, что, вероятно, потребует более компактных операций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...