MS Access 和存储过程

MS Access and Stored Procedures

MS Access 是否支持 .accdb 或 .mdb 数据库上的存储过程?或者只有当后端是 SQL 服务器或其他支持 Access 数据库引擎 (Jet / ACE/ MSDE) 的东西时才支持存储过程?

我从各种来源的 MS Access 和存储过程中找到的信息是混合的并且不是很完整。例如,这个 Access 帮助文件最初看起来像 Access 支持存储过程。

https://support.microsoft.com/en-us/office/create-procedure-statement-91c700d1-8076-4040-896a-a0b7cf9d9888?ns=msaccess&version=90&ui=en-us&rs=en-us&ad=us

当我尝试 运行 以下查询时,它出错说我对 CREATE TABLE 语句的语法不正确。 table 在我本地笔记本电脑上的一个 .accdb 文件中。

CREATE PROCEDURE GetReport  (pFileId Integer) 
AS 
SELECT * FROM FileInfoTable WHERE FileId = pFileId

某些Access DDL 功能仅在使用ADO 执行语句时可用。如果您从 CurrentProject.Connection.Execute 执行语句,您的语句将会成功,如这个即时 window 示例所示:

strSql = "CREATE PROCEDURE GetReport (pFileId Integer)" & vbCrLf & _
     "AS" & vbCrLf & _
     "SELECT * FROM FileInfoTable WHERE FileId = pFileId"
CurrentProject.Connection.Execute strSql

但是请注意,保存的查询对象中的 SQL 文本与 CREATE PROCEDURE 语句中的文本不完全匹配。但我认为它在功能上是等价的。

Debug.Print CurrentDb.QueryDefs("GetReport").SQL
PARAMETERS pFileId Long;
SELECT *
FROM FileInfoTable
WHERE FileId = pFileId;

嗯,是的,access确实有所谓的table触发器,access也有我们所说的存储过程(可以运行在table级别的过程代码-或者实际上您甚至可以从 VBA 或宏调用此类存储过程。

然而,就像MySQL、SQL 服务器、Oracle 等等?对于这些存储过程,它们都有自己的代码系统类型。访问也不例外。

此功能是在 Access 2010 中引入的。但是,此功能与 SQL 支持的 CREATE 过程命令无关。

引入该命令是为了与 SQL 服务器语法“部分”兼容 - 但它非常蹩脚且有限。当您在 Access SQL 中使用 CREATE PROCEDURE 时,它只会创建一个 select 命令。因此,select 命令只是一个 select 命令,不是程序代码。

但是,如前所述,您可以在 Access 中编写存储过程,它们 运行 由数据引擎,它们 运行 在引擎级别。要编写这些例程,您必须使用宏语言。这种语言不是 VBA,也不是 T-SQL(SQL 服务器代码),但 Access 有自己的语法和代码。

这些所谓的 table 例程是在设计模式下处理 table 时创建的。

虽然此类代码有限,但它是真正的过程代码,在大多数情况下不使用 SQL 语法,并且可以从 table 事件中调用此类例程。

并且这些所谓的“数据宏”不是使用 SQL 数据创建命令创建的,为此您只能使用内置的宏编辑器。

请记住,虽然 Access 具有此存储过程代码功能,但它们不是基于事务的。但是,它们的用途非常广泛,因为它们甚至在使用 OLEDB 或 ODBC 源访问时也能发挥作用。

那么,如果你写了这样的代码,然后说用FoxPro打开Access,甚至是.net中的c#?然后你更新一行?程序 table 代码和触发器将 运行.

您可以在此处看到这些选项:

因此,例如,我可以针对每次更改、编辑或向子表单添加行来维护发票的总成本。

宏语言编辑器看起来像这样说:

所以你可以遍历数据,你有 if/then 其他等等

这是一种非常有限的语言 - 但它们实际上是 运行 在 table 级别的真实存储过程代码,并且它们 运行 100% 独立于 VBA 或任何其他代码。

这些 table 存储过程 运行:

  • 编辑表单中的数据时 - 即使是没有代码的表单
  • 当您发出 SQL 更新或修改语句时
  • 当您通过VBA + 记录集代码修改数据时
  • 如果外部 ODBC 或 OLEDB 源(例如 .net c# 或任何修改数据)