【发布时间】:2013-04-10 15:59:16
【问题描述】:
底线是我想尽可能优雅地处理网络断开连接。
我有一个 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。
- 我已断开并重新连接关联的 TableDef,方法是修改和修复“连接”连接字符串。 Access 声称它重新连接正常。
我不明白我看到的行为。 MSAccess 是否在连接数据的某些缓存下运行?如果是这样,为什么它只有时起作用?如果他们真的有一些复杂的离线缓存模式,为什么没有在任何地方记录呢?很遗憾,我不允许在工作中喝酒。
【问题讨论】:
-
+1 最后一句。 (但是,问题的其余部分也值得 +1。)
-
你使用的是
dbFailOnError参数吗? -
是的。抱歉不清楚,我简化了例子,因为完整的代码有点麻烦。