То, что я в основном пытаюсь достичь здесь, - это правильный способ восстановления грязной БД.Как восстановить/восстановить БД ESE с помощью API Microsoft
esentutl /mh db.dat
дает следующие выходные данные
это хорошо, потому что я взял копию БД в то же время открыт другой программой.
Можно ли открыть БД с помощью JetBlue Api от Microsoft без надлежащего журнала & chk файлов? (ESEDatabaseView делает это как-то, nirsoft.net)
Если такой случай не представляется возможным с API Microsoft, и нужны журналы, что правильный способ восстановления БД (я уже изменил мою децибел & журналы местоположение)
вот мой код:
wpath p2 = L"C:\\m.db";
ULONG unPageSize;
long jet_err = JetGetDatabaseFileInfoW(p2.file_string().c_str(), &unPageSize, sizeof(unPageSize), JET_DbInfoPageSize);
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramDatabasePageSize, unPageSize, NULL);
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramRecovery, 0, "Off");
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramLogFilePath, 0, "C:\\");
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramSystemPath, 0, "C:\\");
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetSetSystemParameter(NULL, NULL, JET_paramAlternateDatabaseRecoveryPath, 0, "C:\\");
if (jet_err != JET_errSuccess) {
return false;
}
JET_INSTANCE instance = { 0 };
jet_err = JetCreateInstance(&instance, "instance");
if (jet_err != JET_errSuccess) {
return false;
}
jet_err = JetInit(&instance);
if (jet_err != JET_errSuccess) {
JetTerm(instance);
return false;
}
JET_SESID sesid;
jet_err = JetBeginSession(instance, &sesid, 0, 0);
if (jet_err != JET_errSuccess) {
JetTerm(instance);
return false;
}
jet_err = JetAttachDatabaseW(sesid, pathESEDbLocation.file_string().c_str(), JET_bitDbReadOnly);
if (jet_err != JET_errSuccess) {
JetEndSession(sesid, 0);
JetTerm(instance);
return false;
}
JetAttachDatabaseW
терпит неудачу с -550 JET_errDatabaseDirtyShutdown
Редактировать Я выяснил, что простой вызов esenutl /p data.dat
без каких-либо контрольных точек и файлов журналов также устраняет проблему. Я попытался с помощью команды JetExternalRestoreW
но он продолжает бросать #define JET_errFileNotFound -1811 /* File not found */
JET_RSTMAP_W p = {L"C:/Users/user/AppData/Local/Temp/db/db.dat", L"C:/Users/user/AppData/Local/Temp/db/db.dat"};
jet_err = JetExternalRestoreW(nullptr, L"C:/Users/user/AppData/Local/Temp/db/", &p, 1,L"C:/Users/igalk/AppData/Local/Temp/db/", 0, 0, nullptr);