【发布时间】:2020-10-08 14:30:11
【问题描述】:
背景
我们有一个旧的 MS Access 应用程序,它使用 MS SQL 表作为后端,并根据用户操作按需打印报告(产品标签)。这按预期工作,我们不希望更改这部分。
我有一个新的独立(C# Windows 窗体)应用程序在另一台 PC 上运行,它执行一些几乎不相关的操作,但要求用户在进程结束时打印上述标签。
问题
不是让用户切换到另一台 PC 上的旧版 Access 应用程序(可能位于不同的位置),当从独立 C# 更新数据时,如何触发运行报告的 Access VBA申请?
一种方法
我在想我可以创建一个表RequestedLabels,其中包含LabelId、PrinterId 列。独立应用会插入一行来请求标签,而 MS Access 应用会每隔一小段时间查询该表,以查看是否有任何新标签要为此实例打印。
但是,我不喜欢这种方法的几点:
-
标签应在请求后立即打印,因此我的查询间隔必须非常小(最多 1-2 秒)。即使在 2 秒时,延迟也会令人讨厌。在较高的速率下,我怀疑这可能会干扰 MS Access 应用程序的响应能力。
-
这一次将在 10-20 台机器上运行,因此对 SQL 服务器的查询数约为 20/秒或更多。
-
用户每隔几分钟才打印一次标签,因此执行此操作所需的大部分处理/网络容量都被浪费了。
更好的方法
我希望通过某种方式让基础数据的更改触发 MS Access 中的表单事件,或者触发一些可以按需打印标签的 VBA 函数。
注意事项
这些计算机跨越由严格的防火墙分隔的两个子网,并在域内外运行混合操作系统。由于设置不统一,PC 之间的 RPC 在过去被证明是棘手的。
我更喜欢依赖于更新 SQL 服务器上的数据的解决方案,或者 C# 和 MS Access 应用程序都可以利用的其他一些 MS SQL 功能。
更新:
由于有两次投票结束,我已经改进了措辞,以便更清楚地关注底层数据更改时触发 VBA。
【问题讨论】:
-
您可以只使用 COM 让您的独立应用程序在 Access 应用程序上自动执行操作(例如,使用
Application.Run触发一些 VBA 代码)。似乎比轮询我的变化要好得多。 -
@ErikA 由于操作系统、域与独立 PC 的广泛混合以及 PC 之间的严格防火墙,我们对 PowerShell 远程处理的结果好坏参半。此外,我必须对触发 PC 和打印机 PC 的每种组合进行测试。也就是说,我仍然想试试这个 - 你有任何示例代码可以指点我吗?
标签: c# sql-server ms-access triggers