Я пытаюсь прочитать несмонтированные файлы EDB через esent.dll. Все работает с 4k-страничными базами данных, но когда я пытаюсь прочитать 8k-страничную базу данных, она возвращает ошибку-1414 -> Вторичный индекс поврежден, и база данных должна быть дефрагментирована.
Но дефрагментация с помощью eseutil не решит проблему. (eseutil находится в папке bin того же сервера Exchange, который создал .edb)
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?
Повреждение вторичного индекса обычно происходит из-за изменения порядка сортировки ОС. Дефрагментация базы данных будет считывать все данные из исходной базы данных и создавать совершенно новую базу данных. Вторичные индексы полностью воссозданы.
Поскольку вы сказали, что автономная дефрагментация (eseutil.exe -d, верно?) Не помогает решить проблему, то, вероятно, это не связано с изменением порядка сортировки ОС. Вероятно, это связано с другой внутренней разницей между ese.dll и esent.dll.
О каких версиях ese.dll и esent.dll вы говорите? Exchange не использовал страницы 4k для многих выпусков.
Есть несколько движков базы данных JET.
Вы можете прочитать об этом здесь Ядро базы данных Microsoft Jet
JET Blue предназначен для Exchange Server и Active Directory, расширяемого хранилища (ESE). esent.dll подходит для базы данных Active Directory. Ese.dll это реализация для Exchange Server. Я думаю, что использование esent.dll для чтения и изменения базы данных Exchange приведет к ее повреждению.
JET Красный механизм хранения для Microsoft Access.