c++ - 为什么 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");
解决方案
你不应该设置JET_paramRecovery
. 它默认为开启。尝试删除它。您还在"On"
代码中将其设置为,但您的问题说它已被触发。禁用它也不是一个好主意,因为如果您修改数据库并崩溃,那么此时整个数据库将无法使用。这对于极少数人来说是可以接受的。
而不是设置JET_paramAlternateDatabaseRecoveryPath
,您应该设置日志记录路径。
当您调用JetInit
时,数据库引擎将检查当前日志流,并在必要时重播操作。您需要设置日志记录目录以及检查点文件位置(混淆地称为“系统路径”)。然后它应该能够成功重播日志文件。您可能还需要设置“日志文件基本名称”,默认为“edb”,但可以设置为任何 3 字符序列。
您还可以esentutl.exe
先使用命令行实用程序重播日志。通过切换到日志文件的目录并运行类似esentutl.exe -r edb
.
那有意义吗?
推荐阅读
- python - 如何不使用多重继承混淆类变量?
- rust - Rust PyO3 与 cc 的链接失败
- swift - 在 macOS Monterey 上,无法创建快捷操作
- java - Cosmos DB SDK 的连接问题
- angular - Typescript:如何重置从 DI 注入的服务的属性值
- azure-devops - 在一个构建代理上运行所有 azure 管道阶段
- angular - 在ionic 5中单击谷歌地图标记时如何调用模态控制器
- android - 如何在 LocalDateTime 中使用语言环境?
- python - 如何删除正在播放的 .wav 文件?
- python - 如何确保我的光束管道在 Dataflow 上运行时不会出现解酸错误?