Почему JetAttachDatabase возвращает ошибку -550? - PullRequest
0 голосов
/ 23 мая 2019

стек, мне нужна помощь, JetAttachDatabase возвращает ошибку -550. JET_paramRecovery выключен. Что мне делать, чтобы он начал работать?

Я уже пытался восстановить экземпляр, но у меня нет файла восстановления ... Я не знаю, что мне делать. Теперь у меня есть такой код

sWebDataBase.err = JetGetDatabaseFileInfo(sWebDataBase.path,
                                            &sWebDataBase.dbPageSize,
                                            sizeof(sWebDataBase.dbPageSize),
                                            JET_DbInfoPageSize);

  ErrCheck(sWebDataBase.err, "JetSetSystemParameter, JetGetDatabaseFileInfo");


  sWebDataBase.err = JetSetSystemParameter (&sWebDataBase.instance,
                                            JET_sesidNil,
                                            JET_paramDatabasePageSize,
                                            sWebDataBase.dbPageSize,
                                            NULL);
  ErrCheck(sWebDataBase.err, "JetSetSystemParameter, JET_paramDatabasePageSize");

  sWebDataBase.err = JetSetSystemParameterW(&sWebDataBase.instance,
                                            JET_sesidNil,
                                            JET_paramAlternateDatabaseRecoveryPath,
                                            NULL,
                                            L"C:\\Users\\Chrnykh\\AppData\\Local\\Microsoft\\Windows\\WebCache\\test1.dat");
  ErrCheck(sWebDataBase.err, "JetSetSystemParameter, JET_paramAlternateDatabaseRecoveryPath");

  sWebDataBase.err = JetSetSystemParameter (&sWebDataBase.instance,
                               JET_sesidNil,
                               JET_paramRecovery,
                               NULL,
                               (JET_PCWSTR)"On");
  ErrCheck(sWebDataBase.err, "JetSetSystemParameter, JET_paramRecovery");


  sWebDataBase.err = JetInit (&sWebDataBase.instance); //------------------------------------JetInit
  ErrCheck(sWebDataBase.err, "JetInit");

  sWebDataBase.err = JetBeginSession (sWebDataBase.instance,
                                      &sWebDataBase.sesId,
                                      NULL,
                                      NULL);
  ErrCheck(sWebDataBase.err, "JetBeginSession");


  ErrCheck(sWebDataBase.err, "JetRestoreInstanceW");

  sWebDataBase.err = JetAttachDatabase(sWebDataBase.sesId,
                                        sWebDataBase.path,
                                        JET_bitDbReadOnly);

  ErrCheck(sWebDataBase.err, "JetAttachDatabaseW");

  sWebDataBase.err = JetOpenDatabaseW(sWebDataBase.sesId,
                                      sWebDataBase.path,
                                      NULL,
                                      &sWebDataBase.dbId,
                                      JET_bitDbReadOnly);
  ErrCheck(sWebDataBase.err, "JetOpenDatabaseW");

1 Ответ

0 голосов
/ 24 мая 2019

Вам не нужно устанавливать JET_paramRecovery. По умолчанию включено. Попробуйте удалить это. Вы также устанавливаете его в коде "On", но ваш вопрос говорит, что он был выключен. Это также не очень хорошая идея, чтобы отключить его, потому что если вы измените базу данных и произойдет сбой, тогда вся база данных будет непригодна для использования в этот момент. Это приемлемо для очень небольшого меньшинства людей.

Вместо установки JET_paramAlternateDatabaseRecoveryPath вы должны установить путь ведения журнала.

Когда вы вызываете JetInit, ядро ​​базы данных проверит текущий поток журнала и при необходимости воспроизведет операции. Вам нужно будет установить каталог журналов, а также местоположение файла Checkpoint (путанно называемое «системный путь»). Тогда он сможет успешно воспроизвести файлы журнала. Вам также может понадобиться установить «Базовое имя файла журнала», которое по умолчанию равно «edb», но может быть установлено любая 3-символьная последовательность.

Вы также можете использовать утилиту командной строки esentutl.exe, чтобы сначала воспроизвести журналы. Используйте его, перейдя в каталог файлов журнала и выполнив команду типа esentutl.exe -r edb.

Имеет ли это смысл?

...