从 Access 数据宏运行 SQL 查询

Posted

技术标签:

【中文标题】从 Access 数据宏运行 SQL 查询【英文标题】:Run SQL query from an Access Data Macro 【发布时间】:2015-06-29 10:31:52 【问题描述】:

我正在尝试使用数据宏更新闭包表,这需要在将新记录插入主表时运行以下代码:

INSERT INTO tblClosure (parent_id, child_id, depth)
SELECT p.parent_id, c.child_id, p.depth+c.depth+1
FROM tblClosure AS p, tblClosure AS c
WHERE p.child_id=$PARENT_ID and c.parent_id=$CHILD_ID;

如您所见,可以使用嵌套循环执行此操作:

Iterate through tblClosure
For each record p with child_id = $PARENT_ID 
    Iterate through tblClosure
    For each record c with parent_id = $CHILD_ID 
        Insert (p.parent_id, c.child_id, p.depth + c.depth + 1) into tblClosure
    

主表(tblNodes)和闭包表(tblClosure)都存储在后端数据库中,所以看起来一个数据宏应该能做我想做的。

数据宏似乎有Create Record (in...)For Each Record (in...)功能。但我根本无法让第二个开火。

这是我的代码(我已将temp_nodetemp_parent 定义为参数):

【问题讨论】:

插入新记录时是否要更新同一张表? 不,新记录被插入到 tblNodes 中。我需要遍历并将节点添加到 tblClosure 中。然而,这两个表都在同一个(后端)数据库中。 请提供两个表的表定义、它们之间的关系以及所需/期望的操作/输出。您的代码无助于理解您要做什么。 这是一个层次结构。 tblNodes 包含一个“节点”列表,每个节点都有一个唯一的 node_id 和一个 parent_id(这是从表到自身的外键)。一些节点的 parent_id 为 NULL(它们是链中的第一个)。一个节点可能有很多子节点。 tblClosure 记录了从一个节点到另一个节点的所有可能路径。它有closure_id(不相关的自动编号字段)、parent_id、child_id 和深度。例如,它有一行 (1, 1, 0) 表示节点 1 是深度 0 处节点 1 的父节点。 (1, 5, 8) 表示节点 1 是深度 8 处节点 5 的父节点。 【参考方案1】:

当嵌套在 For Each Record 循环中时,创建记录宏命令将不起作用。请参阅此处 (https://social.msdn.microsoft.com/Forums/office/en-US/f00a88f7-8cdc-48ec-93f9-ca3d698aa6f3/access-2010-datamacro-exception-quotcreaterecord-cannot-be-used-inside-of-a?forum=accessdev) 了解原因。

相反,我建议从您提供的插入语句的值部分在您的 Access 数据库中创建一个查询:

SELECT p.parent_id, c.child_id, p.depth+c.depth+1
FROM tblClosure AS p, tblClosure AS c
WHERE p.child_id=$PARENT_ID and c.parent_id=$CHILD_ID;

接下来,创建 tblClosure 表和您刚刚创建的查询的联合查询。这会将两者显示在一起,就好像它们在一张桌子上一样。通过这个联合查询,您可以对其执行其他操作,就好像它是您的 Access 数据库中的一个表一样。

【讨论】:

以上是关于从 Access 数据宏运行 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

从 VB.NET 调用访问宏问题

宏 - 查询 - Microsoft Access 数据库引擎停止了进程

文本框作为 Access 中 SQL 查询中的输入

从 Excel VBA 运行访问查询

access 数据库 DBHelper 执行查询的命令用啥 我只知道 sqlserver 用 sqlcommand

使用 Python 为 MS Access .accdb 文件运行宏