首页 > 解决方案 > 为什么 JetAttachDatabase 返回错误 -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");

标签: c++databasecppcheckesent

解决方案


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

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

当您调用JetInit时,数据库引擎将检查当前日志流,并在必要时重播操作。您需要设置日志记录目录以及检查点文件位置(混淆地称为“系统路径”)。然后它应该能够成功重播日志文件。您可能还需要设置“日志文件基本名称”,默认为“edb”,但可以设置为任何 3 字符序列。

您还可以esentutl.exe先使用命令行实用程序重播日志。通过切换到日志文件的目录并运行类似esentutl.exe -r edb.

那有意义吗?


推荐阅读