为什么 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
.
的命令来使用它
这有意义吗?
堆栈,我需要帮助,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
.
这有意义吗?