我正在尝试通过esent.dll读取已卸载的EDB文件。一切都适用于4k分页数据库,但是当我尝试读取8k分页数据库时,它返回错误1414->二级索引已损坏,必须对数据库进行碎片整理。
但是使用eseutil进行碎片整理无法解决问题。 (eseutil是从创建.edb的同一交换服务器的bin文件夹中获得的)
JET_ERR err;
JET_INSTANCE instance;
JET_SESID sesid;
JET_DBID dbid;
JET_TABLEID tableid;
JET_COLUMNDEF columndef = { 0 };
JET_COLUMNID columnid;
Call(JetSetSystemParameter(&instance, JET_sesidNil, 64, 8192, NULL)); //JET_paramDatabasePageSize - 64
Call(JetSetSystemParameter(&instance, JET_sesidNil, 34, 0, NULL)); //JET_paramRecovery - 34
//Call(JetSetSystemParameter(&instance, JET_sesidNil, JET_paramCircularLog, 1, NULL));
Call(JetCreateInstance(&instance, "instance"));
Call(JetInit(&instance));
Call(JetBeginSession(instance, &sesid, 0, 0));
JET_PCSTR FileName = "C:\\Users\\user\\Desktop\\EDB\\First Storage Group\\Mailbox Database.edb";
Call(JetAttachDatabase(sesid, FileName, 0));`
而且它不会附加数据库。.您认为这是什么问题?
最佳答案
首先,不建议您将使用ese.dll创建的数据库与esent.dll一起使用,反之亦然。尽管这些API非常相似,但存在内部差异。此外,esent.dll在MSDN上发布,而ese.dll未发布。
您使用esent.dll读取ese.dll创建的数据库是否有原因?
二级索引损坏通常是由于OS排序顺序更改所致。对数据库进行碎片整理将从原始数据库读取所有数据,并创建一个全新的数据库。二级索引已完全重新创建。
由于您说过脱机碎片整理(eseutil.exe -d,对吗?)不能解决问题,所以它可能不是由于操作系统排序顺序更改引起的。这可能是由于ese.dll和esent.dll之间的另一个内部差异。
您到底在谈论哪个版本的ese.dll和esent.dll? Exchange尚未在许多版本中使用4k页。