1

我正在Data Macro为我的访问表After Insert事件之一使用 a。在这个数据宏中,我SetLocalVar用来调用我用 vba 编写的函数之一,将相同的插入记录集插入到我的 SQL 数据库中。

当我在 Access 中输入数据时它可以工作,但是如果我从我的一个基于 C# 的应用程序中插入一条记录,则插入后的事件不会调用我的 Access 函数,因为我没有打开我的 Access 应用程序的实例。

可能有一种方法,After Insert即使记录是从 Access 外部插入的,这个事件也能以某种方式触发我的 vba 函数?

4

1 回答 1

2

数据宏位于“王牌”数据库引擎中,因此其工作方式与 SQL Server 中的存储过程非常相似。但是,如果您调用 + 使用 VBA 例程(这是合法的),那么您将引入 VBA 依赖项,并且该设置仅适用于 Access。因此,如果您通过 ODBC 或 FoxPro 甚至 .net 的任何其他方式打开表,Access 存储过程仍将运行,但 VBA 依赖项将不起作用并且需要 Access。因此,您可以自由安装数据库引擎(以前称为 JET,现在称为 ACE)。像我们过去多年所做的那样安装数据引擎不会安装 VBA,数据库引擎也不会使用或依赖 VBA。

所以数据宏和数据触发代码将从 C# 中运行。但是,调用 VBA 代码需要安装 Access(安装 VBA)。更重要的是,当您有此类触发器调用 VBA 代码时,您必须只更新 Access 中的数据。

因此,ACE 中可用的循环和存储过程甚至可以调用其他存储过程,只要它们仅用 DATA 宏语言编写即可。

因此,让此类表触发器调用 VBA 代码意味着除了安装数据库引擎之外,您还需要依赖 VBA。因此,虽然您可以调用 VBA 代码,但这种设置仅在使用 MS-Access 作为客户端程序时有效。

因此,如果要从 c# 或其他外部语言进行更新,则必须将 VBA 代码重写为数据宏代码。

您确实拥有“大多数”VBA 函数,但没有记录集(每个都使用)。

编辑:我还应该指出,由于在 c# 中使用 ACE 时不能调用 VBA,另一条路是让数据宏对 SQL Server 的链接表进行操作,但数据宏不能对链接(外部)表进行操作。因此,如果数据是从 Access 更新的,那么您的设置肯定可以工作。但是,使用 FoxPro、VB、vb.net、c# 等。在这些情况下,您不能让数据宏代码调用 VBA 或任何其他类型的外部代码 - 并且需要外部代码来更新 SQL服务器,因为数据宏仅在本地本机表上运行(SQL 触发器也非常相似)

于 2017-04-22T19:17:40.910 回答