从 Access 事件驱动数据宏调用 C# 代码?
Posted
技术标签:
【中文标题】从 Access 事件驱动数据宏调用 C# 代码?【英文标题】:Call C# code from Access event-driven Data Macro? 【发布时间】:2016-09-16 07:10:37 【问题描述】:是否可以从 MS Access 数据库文件(不是 Access 应用程序)以某种方式调用 C# 代码?
我的场景是当某个表中发生某些事情时,我必须调用 C# 代码(例如 Web 服务)。
我读到 MS Access 不支持触发器,但它有过程或称为数据宏的东西。
我还不知道 Access 版本。
【问题讨论】:
【参考方案1】:数据宏是在 MS Access 2010 中引入的,是的,您可以从 VBA 代码调用在 C# 中创建的 dll 函数。数据宏在Access中调用VBA函数,VBA调用C# dll函数或使用shell命令运行外部应用程序。
更新
不幸的是,如果使用非 Access 前端,则无法从 DataMacro 运行任何 VBA 代码,Access 需要环境来执行代码,如果非 Access 应用程序通过 ODBC 更改表,则环境不存在,并且执行将失败。
【讨论】:
如果2010年以前的Access数据库只作为非Access前端的后端,只能在前端调用.net代码,无法在后端触发任何代码执行。 好的,我可以在数据库中创建 AfterInsert 宏。但是我怎样才能从这个事件中运行外部 dll 呢?我没有看到像 RunCode 之类的任何 Action。 查看示例,例如,here - 就像您可以调用 Windows API 函数一样,使用Declare
好的,但我没有访问表单。我只能创建 AfterInsert 宏。 RunCode 仅适用于某些按钮事件等。我只有 Access 后端。当我创建 AfterInsert 宏时,没有选择 RunCode 函数的选项
刚刚做了一些测试,看起来没有 Access 前端就无法运行 VBA 代码。我使用来自 Access 后端的 VBA 调用,但 VBA 代码位于前端。如果我尝试直接在后端更改后端数据,则需要在后端使用 VBA 函数代码,如果我使用 ODBC 从非访问前端更改表数据,则会产生错误。所以,看起来我的回答与非访问前端无关,不能用于您的情况,抱歉。 Access是桌面数据库,没有代码执行环境。【参考方案2】:
对于 Sergey 的回答,Access 中的事件驱动数据宏只能在以下情况下调用 VBA 函数
-
正在从 Microsoft Access 本身 (MSACCESS.EXE) 更新该表,并且
VBA 代码可用于调用表更新的 Access 数据库文件。
因此,例如,如果更改前数据宏调用以下函数来检索当前用户的姓名(因此它可以将姓名插入到该表中的字段中,例如 [CreatedBy] 或 [UpdatedBy])
Public Function GetUserName()
Dim wshNet As Object ' WshNetwork
Set wshNet = CreateObject("WScript.Network") ' New WshNetwork
GetUserName = wshNet.UserName
Set wshNet = Nothing
End Function
那么以下条件适用:
从非 Access 应用程序更新表
非 Access 应用程序(例如,使用 System.Data.OleDb 或 System.Data.Odbc 的 .NET 应用程序)根本无法更新表。它会抛出一个错误说
函数“GetUserName”对数据宏中使用的表达式无效。
从 Access 前端更新链接表
只要该函数的 VBA 代码可用于前端文件(.accdb、.accde 等),Access 前端就可以更新表。前端文件不能直接运行存储在后端文件(带有数据宏的表所在的位置)中的 VBA 代码。我们需要
将 VBA 模块从后端文件复制到前端文件,或 在前端文件中使用 VBA 引用来包含来自后端的代码:【讨论】:
好吧,还有一个问题。在表达式生成器中是称为 Web 服务的部分 - 我找不到任何文档。顾名思义,宏可以连接到 Web 服务。但我当然错了? 这似乎是与其 Web/SharePoint 集成相关的 Access 功能之一,并且没有很好的文档记录。有一个“预告”Microsoft 支持文章 here 非常简短,还有一个线程 here 显示了对该功能的理解程度。 我还应该补充一点,Web 服务引用不是某种使用 Web 服务定义 WSDL 的能力,而是以共享点为中心的特定数据 Web 服务。因此,作为一种工具的 Access 没有使用一般 IT 术语意义上的 Web 服务的工具或功能。以上是关于从 Access 事件驱动数据宏调用 C# 代码?的主要内容,如果未能解决你的问题,请参考以下文章
用于计算新记录中的字段的事件驱动数据宏 - MS Access
Libreoffice Base - 如何从宏调用控制事件?