【问题标题】:How can I fix my syntax error 3134 in this code?如何修复此代码中的语法错误 3134?
【发布时间】:2019-12-29 07:08:54
【问题描述】:
Private Sub Form_Close()

    Dim sSQL, stringSQL As String
    Dim rst As DAO.Recordset

    sSQL = "SELECT BarCode, [Goods Name] FROM tblInventory WHERE BarCode='" & Me.ID & "'"
    Set rst = CurrentDb.OpenRecordset(sSQL)
    If rst.EOF Then
        stringSQL = "INSERT INTO tblInventory(BarCode,[Goods Name],Unit,[Unit Price],[Initial Stock],[Current Stock],[Exit Item]) values('" & Me.ID & "','" & Me.GoodsName & "','" & Me.Unit & "'," & Replace(Format(Me.Price, "0.00"), ",", ".") & "," & Me.Amount & "," & Me.Amount & ",0)"
        DoCmd.SetWarnings False
        DoCmd.RunSQL [stringSQL]
        DoCmd.SetWarnings True
    Else
        stringSQL = "UPDATE tblInventory SET [Current Stock]=[Current Stock]+" & Me.Amount & " WHERE BarCode='" & Me.ID & "'"
        DoCmd.SetWarnings False
        DoCmd.RunSQL (stringSQL)
        DoCmd.SetWarnings True
    End If
    rst.Close

End Sub

【问题讨论】:

  • 欢迎来到 SO!当你发布一个只是代码的问题时,试着解释一下哪个是你的问题,你在哪里得到它......事实上,因为它只是代码,你不能应用代码格式,可读性真的很差。跨度>
  • 不要将查询字符串与值混为一谈。相反,学习使用参数。

标签: sql vba ms-access


【解决方案1】:

首先,请注意:

Dim sSQL, stringSQL As String

导致sSQL 被定义为变体,而不是字符串;虽然不会导致您的代码失败(因为 Variant 可以保存任何类型的数据),但内存效率会很低。

相反,您应该使用:

Dim sSQL As String, stringSQL As String

或者,也许更具可读性:

Dim sSQL As String
Dim stringSQL As String

其次,在独立于任何其他表达式调用函数时,不应使用任何类型的括号将参数括起来。

在您的代码中,第 11 行有:

DoCmd.RunSQL [stringSQL]

在第 16 行,你有:

DoCmd.RunSQL (stringSQL)

这两个都应该改成:

DoCmd.RunSQL stringSQL

或者,直接提供 SQL 字符串,例如:

DoCmd.SetWarnings False
DoCmd.RunSQL "UPDATE tblInventory SET [Current Stock]=[Current Stock]+" & Me.Amount & " WHERE BarCode='" & Me.ID & "'"
DoCmd.SetWarnings True

另外,由于您只是使用记录集来测试记录是否存在,您可以将其简化为 DLookup 调用,例如:

DLookup("BarCode","tblInventory","BarCode=Forms![YourForm]!ID")

并使用IsNull 测试这是否返回Null

If IsNull(DLookup("BarCode", "tblInventory", "BarCode=Forms![YourForm]!ID")) Then
    ...
Else
    ...
End If

最后,使用参数化查询代替 SQL 语句中的连接值是更好的做法。

使用参数有两个关键优势:

  • 防止 SQL 注入。
  • 自动处理 SQL 数据类型。

例如,考虑以下代码:

Private Sub Form_Close()
    If IsNull(DLookup("BarCode", "tblInventory", "BarCode=Forms![YourForm]!ID")) Then
        With CurrentDb.CreateQueryDef _
            ( _
                "", _
                "insert into tblInventory(BarCode,[Goods Name],Unit,[Unit Price],[Initial Stock],[Current Stock],[Exit Item]) " & _
                "values(@id, @goodsname, @unit, @unitprice, @initstock, @stock, 0)" _
            )
            .Parameters(0) = Me.ID
            .Parameters(1) = Me.GoodsName
            .Parameters(2) = Me.Unit
            .Parameters(3) = Replace(Format(Me.Price, "0.00"), ",", ".")
            .Parameters(4) = Me.Amount
            .Parameters(5) = Me.Amount
            .Execute
        End With
    Else
        With CurrentDb.CreateQueryDef _
            ( _
                "", _
                "update tblInventory set [Current Stock]=[Current Stock]+@amount where BarCode=@id" _
            )
            .Parameters(0) = Me.Amount
            .Parameters(1) = Me.ID
            .Execute
        End With
    End If
End Sub

【讨论】:

  • 这真的很有帮助,我真的很感激
  • 不客气!如果我的回答充分回答了您的问题,请将答案标记为解决方案(如果您认为合适,请投票),以便其他浏览该网站的人看到该问题已解决。如果您不确定如何执行此操作,请参阅this article。谢谢!
【解决方案2】:

尝试手动运行带有一些值的 SQL。

您可能需要使用参数或正确连接变量,例如使用我的函数CSql

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多