Как сделать исправление Extensible Storage Engine (JetBlue) в коде?
Я использую ESE (JetBlue) в приложении, когда вызывается JetAttachDatabase, он возвращает JET_errDatabaseDirtyShutdown. Что я должен делать в своем приложении? я хочу, чтобы любые незафиксированные транзакции были удалены
2 ответа
Восстановление журнала будет выполнено автоматически при вызове JetInit, который автоматически откатит незавершенные транзакции. Чтобы JetInit работал, он должен найти файлы журналов, поэтому в этом случае вы, вероятно, имеете:
- Удалил логи. Не делай этого.
- Неправильно задан путь к лог-файлу. Всегда устанавливайте один и тот же путь к файлу журнала при инициализации, чтобы ESE могла найти журналы.
- Переместил базу данных. Журналы содержат жестко заданный путь к базе данных, поэтому перемещение базы данных прерывает восстановление. Чтобы справиться с этим, вы можете установить системный параметр альтернативного пути восстановления в каталог, содержащий базу данных.
Вы можете настроить приложение так, чтобы оно автоматически пыталось очистить "грязное завершение", добавив следующее после JetCreateInstance() и перед JetInit(). Да порядок этих вещей важен:
Api.JetSetSystemParameter(instance, JET_SESID.Nil, Server2003Param.AlternateDatabaseRecoveryPath, 0, Path.GetDirectoryName(databasePath));
(Пример выше в C#, но вы поняли...)
Последний параметр - это место, где вы хотели бы, чтобы восстановленная база данных появлялась, так что, скорее всего, это будет тот же каталог, что и грязный файл базы данных.