底线是我想尽可能优雅地处理网络断开连接。
我有一个 Microsoft Access 应用程序,它使用链接表将 UI 与数据“分离”。因此,有两个 msaccess 数据库文件(一个 UI 和另一个数据)。这两个数据库都在我们的内部网络上,并且 UI 使用链接表链接到数据。这是一个非常标准的设置。
代码中只有一个位置需要这种优雅的断开逻辑(即执行 SQL UPDATE 时)。我认为这就像一些错误处理一样简单。但是,Microsoft Access 有时会假装成功!
这是我的世界的窗口:
On Error GoTo ErrorHandler:
Call CurrentDb.Execute("UPDATE [Thing] SET [Length]=5 WHERE [ID]=1;", dbFailOnError)
On Error GoTo 0
...(continued code)...
ErrorHandler:
fSuccess = False
Resume Next
我启动应用程序,拔掉我的网线(不,wifi 没有打开),但有时错误处理从未发生过,即使它实际上并没有更新!澄清一下,当断开连接时,我希望此更新失败,并且我想检测它!
我一直在尝试解决像这样对我撒谎的 Access。我越是尝试,我就越绝望:
- 我注意到的第一件事是,如果我使用调试器单步执行,它将正确且可靠地失败。不过,这对我没有帮助。
- 我试过检查更新操作的RecordCount,但是当它假装成功时,它真的设置为 1!
- 我已经尝试执行后续的 SELECT 语句来查看 UPDATE 是否真的发生了。但是,即使我在 UPDATE 中输入了一个随机数,访问也会返回正确的结果。
- 我查看了 Access 对象(如 CurrentDb 和 TableDefs),寻找任何可靠的迹象表明它在“离线模式”或“缓存模式”下工作。我找不到任何指标。这对我有很大帮助。
- 链接表的 RecordCount 始终为 -1,无论是已连接还是已断开连接。
- 我通过修改和修复“Connect”连接字符串断开并重新连接了关联的 TableDef。Access声称它重新连接正常。
我不明白我看到的行为。MSAccess 是否在连接数据的某些缓存下运行?如果是这样,为什么它有时只工作?如果他们真的有一些复杂的离线缓存模式,为什么没有在任何地方记录呢?不幸的是,我不允许在工作中喝酒。