1

我有一个用 Java 编写的简单服务器,它为我的客户端应用程序提供来自访问数据库 (.accdb) 的数据

数据来自数据库中的查询,该查询将来自链接的 Excel 工作簿 (.xlsx) 中的多个工作表的数据组合在一起

这没有成功,因为所有者需要定期更新 excel 工作簿,并且数据库需要恒定的正常运行时间,并且当数据库打开时,excel 会锁定文件。

所以为了规避这个问题,我将数据库更改为运行工作簿的副本。我编写了一个批处理脚本来杀死 java 服务器,从而关闭与数据库的连接并解锁复制的 excel 工作簿。然后它将原始内容复制到复制的文件位置,并重新启动服务器,从而更新数据库中的数据。我将 Windows 任务计划程序设置为每天运行此批处理文件。

马虎的解决方案,但它的工作。或者我是这么想的。批处理文件只运行一次,从那以后就没有运行过。

因此,在我为此扔另一个创可贴之前,我想我会在这里问。当特定用户需要访问文件时,是否可以设置原始 Excel 工作簿以关闭所有连接?如果我能做到这一点,我所要做的就是让我的服务器在断开连接后尝试重新连接,这应该不难。

4

1 回答 1

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

如果你能找出连接的索引。或者也许遍历所有这些,然后重新启动它们。目前没有时间尝试确定此解决方案是否有效。希望它能让你站稳脚跟。

于 2012-06-28T04:51:56.023 回答