Как сделать исправление Extensible Storage Engine (JetBlue) в коде?

Я использую ESE (JetBlue) в приложении, когда вызывается JetAttachDatabase, он возвращает JET_errDatabaseDirtyShutdown. Что я должен делать в своем приложении? я хочу, чтобы любые незафиксированные транзакции были удалены

2 ответа

Решение

Восстановление журнала будет выполнено автоматически при вызове JetInit, который автоматически откатит незавершенные транзакции. Чтобы JetInit работал, он должен найти файлы журналов, поэтому в этом случае вы, вероятно, имеете:

  1. Удалил логи. Не делай этого.
  2. Неправильно задан путь к лог-файлу. Всегда устанавливайте один и тот же путь к файлу журнала при инициализации, чтобы ESE могла найти журналы.
  3. Переместил базу данных. Журналы содержат жестко заданный путь к базе данных, поэтому перемещение базы данных прерывает восстановление. Чтобы справиться с этим, вы можете установить системный параметр альтернативного пути восстановления в каталог, содержащий базу данных.

Вы можете настроить приложение так, чтобы оно автоматически пыталось очистить "грязное завершение", добавив следующее после JetCreateInstance() и перед JetInit(). Да порядок этих вещей важен:

Api.JetSetSystemParameter(instance, JET_SESID.Nil, Server2003Param.AlternateDatabaseRecoveryPath, 0, Path.GetDirectoryName(databasePath));

(Пример выше в C#, но вы поняли...)

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

Другие вопросы по тегам