添加没有From子句的查询

时间:2013-03-24 22:22:19

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

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

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子句。我知道您可以使用INSERT INTO ... VALUES而不使用FROM来插入单个记录,但即使这样,您也必须提供实际值而不是字段名称。

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

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

* *编辑 - 一个补充说明,此行为仅在使用DoCmd.RunSQL时显示。如果我将相同的SQL字符串放入db.Execute,它将返回“错误的参数数量”错误。

1 个答案:

答案 0 :(得分:2)

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

在您的情况下,我会怀疑是否存在损坏并执行反编译来清理已编译的代码。首先备份数据库以便安全保存。您可以在此问题的2个答案中找到有关反编译的详细说明:HOW TO decompile and recompile

坦率地说,腐败是一种疯狂的猜测。但是,由于您的部分源代码神秘地消失了,并且Access仍然存在,因此腐败似乎更有可能。

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