sql - 附加没有 From 子句的查询

标签 sql ms-access vba ms-access-2000

我有一个记录金融交易的 MS Access 数据库。它有一个名为 frmDeposits 的表单,该表单基于表 tblDep。该窗体上的一个按钮运行一个过程,该过程使用 DoCmd.RunSql 将数据从当前记录插入另一个表 tblAccount。代码如下所示:

DoCmd.RunSQL "INSERT INTO tblAccount ([Date], CheckNo, Amount, Vendor, Cleared, Deposit, Printed, Misc) " _
        & "SELECT [Date], CheckNo, Amount, Vendor, Cleared, " & ident & " AS Deposit, Printed, Misc " & _
        & "FROM tblDep WHERE Form=" & formnum & ";"

formnum 变量设置在别处,并标识表单中的当前记录。 ident 变量也在别处定义。

不知何故,在我调试其他部分代码的过程中,这条SQL语句的最后一行被擦掉了,留下:

DoCmd.RunSQL "INSERT INTO tblAccount ([Date], CheckNo, Amount, Vendor, Cleared, Deposit, Printed, Misc) " _
        & "SELECT [Date], CheckNo, Amount, Vendor, Cleared, " & ident & " AS Deposit, Printed, Misc"

令人惊讶的是,表格继续正确运行!此 RunSQL 语句仍在从 frmDeposits 中获取当前记录并将其插入到 tblAccount 表中。

我的问题是,为什么这样做有效?我认为带有 SELECT 的 SQL 语句必须有一个 FROM 子句。我知道您可以使用不带 FROM 的 INSERT INTO ... VALUES 来插入单个记录,但即便如此您也必须提供实际值而不是字段名称。

我注意到的另一件事:这似乎只适用于表单模块中的代码。如果我将 SQL 字符串粘贴到查询设计中并运行它,或者在表单范围之外运行类似代码,我会得到每个字段的“输入参数值” 弹出框。 VBA 是否预先解析 SQL 字符串,并获取参数的表单字段或文本框?还是将 FROM 默认为表单的 RecordSource?对于 SQL 字符串中引用的所有字段,我在表单上没有文本框,尽管它们都存在于表单的基础表中。

顺便说一句,这是在 Access 2000 中运行的。是的,我知道这是一个过时的版本,但这就是我必须使用的版本。

**编辑 - 添加了一个注释,此行为仅在使用 DoCmd.RunSQL 时出现。如果我将相同的 SQL 字符串放入 db.Execute,它会返回“参数数量错误”错误。

最佳答案

VBA 代码在 Access 应用程序中以两种形式存在:纯文本源;并编译了“p代码”。也许发生的事情是当源代码文本的那部分丢失时存储的 p 代码没有改变。 IOW,它仍然包含缺少的 FROM 子句的符号。

在您的情况下,我会怀疑损坏并执行反编译以清理编译代码。首先对数据库进行备份以便妥善保管。您可以在这个问题的 2 个答案中找到反编译的详细说明:HOW TO decompile and recompile .

坦率地说,腐败是一种疯狂的猜测。但是,由于您的部分源代码神秘地消失了,而 Access 的运行就像它仍然存在一样,因此损坏的可能性似乎更大。

另一种可能性是您有 DoCmd.SetWarnings = False。静默关闭 SetWarnings 会丢弃有关失败的 INSERT 尝试的错误消息。因此您没有看到错误消息,但实际上也没有插入任何内容。

关于sql - 附加没有 From 子句的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15604753/

相关文章:

sql - 根据另一个表的日期范围更新一个表

sql - 我怎样才能快速删除 postgres 中的行?

mysql - 添加联接时结果的奇怪顺序

class - VBA 使用一个类作为另一个类的属性

string - 如何仅在分隔符的第一个实例之后拆分字符串?

c# - 为什么在 C# 中创建表时收到不正确的语法错误

database - “列 'CustID' 不允许为空。”尝试写入 Access 数据库 VB.net 时出错

ms-access - 如果在 Access 数据库中插入重复数据,则显示人为错误

sql - 我应该在 MS Access 中使用什么 SQL 查询从两个表中获取数据,其中一个表中可能没有任何数据

vba - 通过 VBA 从另一个工作簿复制数据