为什么 JetAttachDatabase return 错误 -550?

Why does JetAttachDatabase return error -550?

堆栈,我需要帮助,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");

您不必设置 JET_paramRecovery。它默认为打开。尝试删除它。您还在代码中将其设置为 "On" ,但是您的问题说它已被触发。禁用它也不是一个好主意,因为如果您修改数据库并崩溃,那么整个数据库此时将无法使用。这对于极少数人来说是可以接受的。

您应该设置日志记录路径,而不是设置 JET_paramAlternateDatabaseRecoveryPath

当您调用 JetInit 时,数据库引擎将检查当前日志流,并在必要时重放操作。您需要设置日志记录目录以及检查点文件位置(容易混淆地称为 "System Path")。然后它应该能够成功重播日志文件。您可能还需要设置 "Log file base name",默认为 "edb",但它可以设置为任何 3 字符序列。

您也可以使用 command-line 实用程序 esentutl.exe 先重播日志。通过更改到日志文件的目录和 运行 类似 esentutl.exe -r edb.

的命令来使用它

这有意义吗?