尝试使用ManagedEsent访问/附加ESE数据库时出现问题

时间:2015-09-28 04:40:08

标签: c# .net database esent extensible-storage-engine

我尝试使用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文件可能无效吗?

2 个答案:

答案 0 :(得分:1)

你从哪里获得数据库? 您所做的应该适用于Cleanly-shut-down数据库。您不需要这些数据库的事务日志文件。 但也有Dirty数据库(当JetTerm没有优雅地完成时)。您需要这些事务日志文件。 还有备份数据库,这些数据库再次略有不同。对于这些数据库,您需要调用JetRestore。

-Martin

答案 1 :(得分:1)

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

esentutl /p Blah.edb

运行之后,我可以附加/打开数据库并从数据库中的表中读取。 我不确定修复实际上对文件做了什么(例如,如果它现在可能缺少某些数据或其他内容)。