3

我有一个记录金融交易的 MS Access 数据库。它有一个名为frmDepositstable的表单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 语句仍在从frmDepositstblAccount 表中提取当前记录并将其插入。

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

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

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

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

4

1 回答 1

2

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

在您的情况下,我会怀疑损坏并执行反编译以清理已编译的代码。首先备份数据库以确保安全。您可以在此问题的 2 个答案中找到反编译的详细说明:如何反编译和重新编译

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

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

于 2013-03-24T23:26:09.020 回答