我正在使用Data Macro
访问我的一个Access表的After Insert
事件。在这个数据宏中,我使用SetLocalVar
来调用我在vba中编写的一个函数,将相同的插入记录集插入到我的SQL数据库中。
当我在Access中输入数据时它会起作用,但是如果我从我的一个基于C#的应用程序中插入一条记录,那么插入后的事件将不会调用我的Access函数,因为我没有打开我的Access应用程序的实例。
可能有一种方法,这个After Insert
事件可以以某种方式触发我的vba函数,即使从Access的外部插入记录?
答案 0 :(得分:2)
数据宏位于“ace”数据库引擎中,因此与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服务器的链接表上运行,但数据宏无法在链接(外部)表上运行。因此,如果从Access更新数据,您的设置肯定会起作用。但是使用FoxPro,VB,vb.net,c#等DOES允许并运行数据宏代码在这些情况下你不能让数据宏代码调用VBA或任何其他类型的外部代码 - 并且需要外部代码来更新SQL服务器,因为数据宏只能在本地本机表上运行(对于SQL触发器也非常相似)