Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Ms Access数据宏开箱即用调用VBA函数_C#_Vba_Ms Access_Ms Access Data Macro - Fatal编程技术网

C# Ms Access数据宏开箱即用调用VBA函数

C# Ms Access数据宏开箱即用调用VBA函数,c#,vba,ms-access,ms-access-data-macro,C#,Vba,Ms Access,Ms Access Data Macro,我正在使用数据宏作为我的一个访问表的插入后事件。在这个数据宏中,我使用SetLocalVar调用用vba编写的函数之一,将相同的插入记录集插入SQL数据库 当我在Access中输入数据时,它会工作,但是如果我从基于C#的应用程序中插入一条记录,插入后事件不会调用我的Access函数,因为我没有打开Access应用程序的实例 是否有一种方法,即使记录是从Access外部插入的,插入后的事件也会以某种方式触发我的vba函数?数据宏位于“ace”数据库引擎中,因此工作方式与SQL server中的存储

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

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


是否有一种方法,即使记录是从Access外部插入的,插入后的
事件也会以某种方式触发我的vba函数?

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

因此,数据宏和数据触发代码将从c#开始工作。但是,调用VBA代码需要安装访问权限(安装VBA)。更重要的是,当您有这样的触发器调用VBA代码时,您必须仅从Access更新数据

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

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

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

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

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

否,我认为在使用ADO.NET插入记录时,无法触发After Insert事件。所涉及的库(OleDB)直接作用于数据库文件,而不知道Access应用程序的存在以及Access宏是什么。我只是做了一个非常简单的测试,使用Visual Studio和
Provider=Microsoft.ACE.OLEDB.12.0
连接并更新带有更新前数据宏的表,它确实触发并运行了数据宏。这并不能回答有关SetLocalVar的问题,但至少数据宏是使用ACE提供程序运行的。@CPerkins感谢您花时间测试它,是的,我相信它确实运行数据宏,即使与您一样连接。但是,如果通过SetLocalVar从DataMacro调用函数,则不会从该函数调用该函数。如果有一种方法,在您的脑海中出现,请让我知道。我不明白即使在Access中,您是如何从数据宏运行另一个函数的。文档中指出,“SetLocalVar操作创建的变量只能在定义它们的宏中使用。”除非您利用了一些隐藏的功能或bug,否则我认为不可能调用/触发数据宏之外的任何函数。这就是为什么数据宏的可用操作集非常有限的原因。我收回这一点。我主要使用插入前宏,很少使用插入/更新后宏。我现在看到,它确实可以触发其他命名的数据宏,但它们的功能仍然有限。我不同意Steve的评论,即它“不知道…Access宏”。显然ACE数据库引擎确实知道并且至少可以执行一些宏操作。用更多细节编辑你的问题。尝试导出数据宏并发布XML。(使用VBA,如“SaveAsText acTableDataMacro”、“TableName”、“C:\PathToFile\DataMacro.xml”)此代码显示了如何模拟For/Next循环,但这与问题无关。它还说数据宏有“大多数”VBA函数,但实际上它是一个非常非常小的选择。。。绝对不是“大多数”。@CPerkins由于提供的示例,我没有选择答案。之所以选择它,是因为它表明在Access之外不可能通过
DataMacro
调用VBA函数。