【问题标题】:Syntax Error in INSERT INTO Statement (Error 3134)INSERT INTO 语句中的语法错误(错误 3134)
【发布时间】:2018-12-30 20:40:13
【问题描述】:

我使用的是 MS Access 2013。我当前的问题是以下代码,我用来记录用户活动。 表名为:tbl-activitylog,有五列:

id
timestamps
Username
Activity
Additional

我在一个又一个字符之后检查了很多次代码,但不知道出了什么问题:(

TempVars("UserName").Value = "admin"
Logging("Logon", "system")
Public Sub Logging(Activity, Additional As String)
    Dim sql_code As String
    sql_code = "INSERT INTO tbl-activitylog(Username, Activity, Additional) VALUES('" & TempVars("UserName").Value & "','" & Activity & "','" & Additional & "')"
    Debug.Print sql_code
    CurrentDb.Execute sql_code
End Sub

调试打印显示:

INSERT INTO tbl-activitylog(Username, Activity, Additional) VALUES('admin','Logon','System')

【问题讨论】:

  • 尝试:INSERT INTO [tbl-activitylog]([Username], [Activity], [Additional]) VALUES('admin','Logon','System')
  • 使用 [] 作为表名和字段名。而且,更重要的是,使用参数而不是这样的字符串连接。

标签: sql vba ms-access


【解决方案1】:

因为使用了“-”所以必须这样[tbl-activitylog]

sql_code = "INSERT INTO [tbl-activitylog](Username, Activity, Additional) VALUES('" & TempVars("UserName").Value & "','" & Activity & "','" & Additional & "')"

【讨论】:

    【解决方案2】:

    此 3134 错误表示您的 INSERT 语句中存在语法错误。由于您的表格名称包含破折号,因此您需要将其括在方括号中:

    INSERT INTO [tbl-activitylog]
        (Username, Activity, Additional)
        VALUES('admin','Logon','System')
    

    一般来说,您最好将所有字段和表名括起来,以避免与ms-access reserved words 发生冲突的所有风险,例如:

    INSERT INTO [tbl-activitylog]
        ([Username], [Activity], [Additional])
        VALUES('admin','Logon','System')
    

    【讨论】:

      【解决方案3】:

      考虑参数化查询,any 应用层语言在any 数据库中运行 SQL 的行业最佳实践。使用QueryDefs,您可以在 MS Access 中参数化查询。

      更多的 MS Access 将不允许您保存有语法问题的查询。因此,请务必使用方括号或反引号转义特殊字符和保留字。

      SQL (下面另存为查询对象)

      PARAMETERS UsernameParam Text, ActivityParam Text, AdditionalParam Text;
      INSERT INTO [tbl-activitylog] ([Username], [Activity], [Additional])
      VALUES ([UsernameParam], [ActivityParam], [AdditionalParam])
      

      VBA (参考上面的查询并绑定不带引号或连接的值)

      TempVars("UserName").Value = "admin"
      Logging("Logon", "system")
      
      Public Sub Logging(Activity, Additional As String)
          Dim sql_code As String
          Dim qdef As QueryDef
      
          Set qdef = CurrentDb.QueryDefs("mySavedQuery")
      
          ' BIND PARAMS
          qdef![UsernameParam] = TempVars("UserName")
          qdef![ActivityParam] = Activity
          qdef![AdditionalParam] = Additional
      
          qdef.Execute dbFailOnError
      
          Set qdef = Nothing
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多