1

我正在尝试使用 ManagedEsent 库读取 ESE 数据库 (.edb)。但是,我在设置数据库时遇到错误。在附加数据库(调用 JetAttachDatabase())时似乎出现了错误。

我收到的错误消息是“软恢复旨在备份数据库。应该使用恢复”。

下面是我的代码:

JET_INSTANCE instance;
JET_SESID sesid;

Microsoft.Isam.Esent.Interop.SystemParameters.DatabasePageSize = 8 * 1024;

Api.JetCreateInstance(out instance, Guid.NewGuid().ToString());
Api.JetInit(ref instance);

JET_DBID dbid;
JET_COLUMNID columnid;
JET_TABLEID tableid;
JET_COLUMNDEF columndef = new JET_COLUMNDEF();

Api.JetBeginSession(instance, out sesid, null, null);

Api.JetAttachDatabase(sesid, @"Blah.edb", AttachDatabaseGrbit.None);

Api.OpenDatabase(sesid, @"Blah.edb", out dbid, OpenDatabaseGrbit.None);

我得到的例外是:

Microsoft.Isam.Esent.Interop.EsentSoftRecoveryOnBackupDatabase
Soft recovery is intended on a backup database. Restore should be used instead
at Microsoft.Isam.Esent.Interop.Api.Check(Int32 err) in e:\src\codeplex_svn\codeplex\EsentInterop\Api.cs:line 2894
at Microsoft.Isam.Esent.Interop.Api.JetAttachDatabase(JET_SESID sesid, String database, AttachDatabaseGrbit grbit) in e:\src\codeplex_svn\codeplex\EsentInterop\Api.cs:line 372

有什么想法可能导致这种情况吗?我附加的 .edb 文件可能无效吗?

4

2 回答 2

2

运行 EsentUtl 实用程序修复数据库文件后,我能够访问数据库:

esentutl /p Blah.edb

运行此程序后,我可以附加/打开数据库并从数据库中的表中读取。我不确定修复实际上对文件做了什么(例如,如果它现在可能丢失了一些数据或其他东西)。

于 2015-09-30T01:53:09.603 回答
1

你从哪里得到的数据库?您所做的应该适用于完全关闭的数据库。您不需要这些数据库的事务日志文件。但也有脏数据库(当 JetTerm 没有正常完成时)。您将需要这些事务日志文件。还有备份数据库,它们又略有不同。对于这些数据库,您需要调用 JetRestore。

-马丁

于 2015-09-28T20:51:58.197 回答