我有一个用Java编写的简单服务器,它为我的客户端应用程序提供来自访问数据库(.accdb)的数据
数据来自数据库中的查询,该查询组合了链接的Excel工作簿(.xlsx)中多个工作表的数据
这没有用,因为excel工作簿需要由所有者定期更新,并且数据库需要持续正常运行时间,并且excel在数据库打开时锁定文件。
为了规避问题,我将数据库更改为运行工作簿的副本。我编写了一个批处理脚本来杀死java服务器,从而关闭与数据库的连接并解锁复制的excel工作簿。然后,它会将原始内容复制到复制的文件位置,然后重新启动服务器,从而更新数据库中的数据。我将Windows任务计划程序设置为每天运行此批处理文件。
邋solution的解决方案,但它有效。或者我想。批处理文件只运行一次,从那时起就没有运行。
所以在我再向这个投掷另一个绑带之前,我想我会问这里。当特定用户需要访问文件时,有没有办法设置原始excel工作簿以关闭所有连接?如果我能做到这一点,我所要做的就是让我的服务器在断开连接后尝试重新连接,这应该不会很难。
答案 0 :(得分:0)
我一直在努力思考并提出更好的解决方案,但在我的机器上,我没有像你所描述的那样有任何问题。服务器和客户端是否在不同的计算机上?当我更新工作簿中的某些内容时,Access会自动查看它,尽管它们都在同一台机器上打开。可能是Access当时没有对数据做任何事情。
无论哪种方式,你可能想要考虑仍然像你一样使用副本并在ThisWorkbook对象下添加这个宏:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
' code to overwrite the databasecopy here
' use the Shell() procedure to run system commands to shutdown the database connections
' as you need
End Sub
这样您仍然可能需要关闭服务器,但至少可以立即执行此操作,并且只有在更新工作簿时才能执行此操作。
另外,我已经四处查看了您提出的实际问题,但没有找到任何确切的问题。你可能会尝试这样的事情:
Set ActiveWorkbook.Connections() = Nothing
如果可以找出连接的索引。或者也许迭代所有这些,然后在之后重新启动它们。没有时间尝试弄清楚此解决方案目前是否有效。希望它让你站稳脚跟。