【问题标题】:MS Access: SQL statement "UPDATE" gives vague error 3144 "Syntax error in UPDATE statement"MS Access:SQL 语句“UPDATE”给出模糊错误 3144“UPDATE 语句中的语法错误”
【发布时间】:2017-06-13 09:30:45
【问题描述】:

我目前正在运行一个链接到表格的表单,其中显示在表单中的一个控件依赖于另一个控件。具体来说,是一个叫做Machine Excavation的字段,它需要是用户在Hand Excavation字段中输入百分比的剩余百分比。这些字段与从名为 Excavation Type 的表单中的另一个控件指定的特定记录相关。例如,如果我在 Hand Excavation 中输入 30%,那么 Machine Excavation 需要为 70%。我创建了一个代码,该代码将在 Hand Excavation 控件中执行 AfterUpdate 事件时使用 VBA 中的 RunSQL 方法将其存储在基础表中:

Private Sub Text_HandExcvPerc_AfterUpdate()

DoCmd.RunSQL ("UPDATE tbl-ExcavationType SET [Machine Excavation] = 1 - [Hand Excavation] WHERE [Excavation Type] = Text_ExcvType.Value;") End Sub

tbl-ExcavationType 是链接到表单的表格,Text_ExcvType.Value 是包含当前记录标识符的文本框控件。有人可以评论我的 DoCmd.RunSQL 的语法吗?我不断收到错误消息。

【问题讨论】:

  • (a) Text_ExcvType.Value 是 SQL 语句的一部分,还是您的意思是 WHERE [Excavation Type] = " & Text_ExcvType.Value & ";"? (b) 我不确定,但tbl-ExcavationType 可能需要放在括号中,即[tbl-ExcavationType]
  • 是的,这就是我对 Text_ExcvType.Value 的意思,但即使使用了下面 Harrassed Dad 给出的正确语法,它仍然不起作用。

标签: sql database vba ms-access


【解决方案1】:

你有几个问题:

  1. 您需要将表名括在括号中,因为它包含-
  2. 您需要将文本值括在单引号 (') 或双引号 (") 中。
  3. 您需要将Text_ExcvType.Value 的值而不是字符串"Text_ExcvType.Value" 添加到查询中。

我已经测试了以下工作:

Private Sub Text_HandExcvPerc_AfterUpdate()
    DoCmd.RunSQL "UPDATE [tbl-ExcavationType] SET [Machine Excavation] = 1 - [Hand Excavation] WHERE [Excavation Type] = '" & Text_ExcvType.Value "';"
End Sub

【讨论】:

    【解决方案2】:
    DoCmd.RunSQL ("UPDATE [tbl-ExcavationType] SET [Machine Excavation] = " & _
        "1 - [Hand Excavation] WHERE [Excavation Type] = """ & Text_ExcvType.Value & """;")
    

    请注意,文本框值周围有三个引号。 Access 对字符串使用双引号而不是单引号。因为您在字符串中输入它,所以您必须使用两个双引号来指示字符串的单双引号,然后使用另一个双引号来断开字符串以连接您的值。系统看到的实际上是这样的:

    UPDATE [tbl-ExcavationType] SET [Machine Excavation] = 1 - [Hand Excavation] WHERE [Excavation Type] = "My Data Value";
    

    【讨论】:

    • 这不起作用。你的意思是在某处放一组单引号吗?另外,是否有另一种方法可以通过使用来自另一个字段但相同指定记录的值进行计算来将值放入表中?我尝试使用验证规则,但它不会自动填充,只是限制输入。
    • Access 使用双引号,而不是单引号,所以这应该不是问题。它会给你同样的错误吗?
    • 是的 error3144 非常模糊。有没有办法只调试 SQL?
    • 只是一个快速的虚拟检查,确保表名和字段名都拼写正确。另外,如果您使用了我在其中放置的换行符,请确保您正确输入了该格式。您还可以尝试将您的 SQL 语句设置为字符串并使用 Debug.Print 确保它像我展示的那样显示出来。
    • FWIW - Access 接受文本值周围的单引号或双引号。
    【解决方案3】:

    这里的内容似乎是一个计算字段:即 [Machine Excavation] 始终为 1 - [Hand Excavation] 所以我不明白为什么需要存储它。也就是说,您需要将“Text_ExcvType.Value”一词替换为控件中名为 Text_ExcvType 的实际值,而它在语音标记内时无法执行此操作。试试看

    dim strsql as string
    
    strsql = "UPDATE tbl-ExcavationType SET [Machine Excavation] = "
    
    strsql = strsql & "1 - [Hand Excavation] WHERE [Excavation Type] = '"
    
    strsql = strsql & Text_ExcvType.Value & "';" 
    
    DoCmd.RunSQL strsql
    

    这允许访问首先评估Text_ExcvType.Value,将结果放入字符串然后执行sql 这样做还可以让您在调试中观察字符串构建以找出问题所在

    【讨论】:

    • 首先,感谢您的回复。我使用了您的代码,但是弹出了相同的错误,并且调试突出显示了字符串已经连接的最后一行。不知道还有什么可能......关于你的第一个问题,只有查询允许你输入计算。我可以使用验证规则,但不会自动填充单元格。
    猜你喜欢
    • 2018-06-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多