C# 尝试使用ManagedSent访问/连接ESE数据库时出现问题

C# 尝试使用ManagedSent访问/连接ESE数据库时出现问题,c#,.net,database,esent,extensible-storage-engine,C#,.net,Database,Esent,Extensible Storage Engine,我正在尝试使用ManagedSent库读取ESE数据库(.edb)。但是,我在设置数据库时遇到了一个错误。附加数据库时(调用JetAttachDatabase())似乎出现错误 我收到的错误消息是“软恢复是在备份数据库上进行的。应改为使用还原” 下面是我的代码: JET_INSTANCE instance; JET_SESID sesid; Microsoft.Isam.Esent.Interop.SystemParameters.DatabasePageSize = 8 * 1024; A

我正在尝试使用ManagedSent库读取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文件可能无效吗?

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


-martin

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

esentutl /p Blah.edb
运行此操作后,我可以附加/打开数据库并从数据库中的表中读取数据。
不过,我不确定修复对文件实际做了什么(例如,现在是否可能丢失了一些数据或其他内容)。

感谢Martin的回复。数据库来自第三方应用程序(例如,不是Microsoft/Windows数据库)。备份的数据库文件是否与实时(.edb)数据文件不同?(我以前试过在我的.edb文件上运行JetStore,但它不起作用,可能是因为它不是一个实际的备份文件?)。原因源于磁带备份的时代,当时您必须按顺序写入文件。在写入大型数据库文件时,数据库头会发生变化,在复制这么多数据之后,您需要写入更新的头。这会卡在文件的末尾。JetStore需要知道如何处理这种差异。是的,“修复”应该真正被称为“打捞”。它尽其所能使数据库可读。如果它不知道如何修复一个表,它只会删除该表。它的设计目的是让您能够访问一些数据,但无法保证不会丢失大量数据。至于它做了什么,您可以查看rePair创建的“blah.integ.raw”文件。它列出了它执行的所有操作。感谢Martin指导我使用.raw文件。我看了一下,有几行有点担心:错误:数据库未完全关闭(脏关闭)警告:数据库文件太大(预期为299536页,文件为299537页)将Blah.edb扫描数据库的签名从第1页更改为第299537页错误-1018读取第299537页。该页面已调零,因此在线备份可以将第299537页插入BadPages表。我不确定应用程序如何执行其db“备份”-根据错误消息,它必须在不首先关闭服务器的情况下执行备份。我还注意到,与我使用的Blah.edb相同的文件夹中有一个.log文件(edb00A55.log)和一个.pat文件(Blah.pat)。我是否应该以某种方式利用这些文件来恢复数据库而不丢失任何数据?是的,备份过程是在线完成的,并且有意使数据库在此状态下“脏”,同时需要日志文件中的信息。必须进行硬恢复(恢复),这还包括补丁文件。