在INSERT INTO语句中获取语法错误

时间:2017-03-29 14:24:43

标签: database vba ms-access

我需要帮助搞清楚为什么我在尝试在Microsoft Access中运行此代码时出现此语法错误。我正在研究这个数据库的工作,并且有一些经验,但不是很多。

我在我正在处理的数据库之前创建了一个数据库,它运行正常。它与我现在正在处理的数据库非常相似,所以我只是复制它,然后重命名字段和文本框以及所有内容以匹配此数据库将要处理的信息。

基本上我有一个包含数据的表格,然后我想要一个表格,其中包含表格中每个字段的文本框,主表格的子表格合并到表格中。用户使用信息填写文本框,然后将其添加到表格中,或者他们可以单击记录并对其进行编辑或使用表单上的相应按钮将其删除。

现在我收到运行时错误“3134”:尝试单击其中一个表单上的“添加”按钮时INSERT INTO语句中出现语法错误。这只发生在添加按钮上,因此如果设置为更新,则会发生更新按钮,但所有其他按钮都能正常工作。

以下是新数据库的代码:

Option Compare Database

Private Sub cmdAdd_Click()
    'when we click on button Add there are two options
    '1. for insert
    '2. for update
    If Me.txtICN.Tag & "" = "" Then
        'this is for insert new
        'add data to table
        CurrentDb.Execute "INSERT INTO tblInventory(ICN, manu, model, serial, desc, dateRec, dateRem, dispo, project, AMCA, UL, comments) " & _
        " VALUES(" & Me.txtICN & ", '" & Me.txtManu & "', '" & Me.txtModel & "', '" & Me.txtSerial & "', '" & Me.txtDesc & "', '" & Me.txtDateRec & "', '" & Me.txtDateRem & "', '" & Me.txtDispo & "', '" & Me.txtProject & "', '" & Me.txtAMCA & "', '" & Me.txtUL & "', '" & Me.txtComments & "')"
    Else
        'otherwise (Tag of txtICN store the ICN of item to be modified)
        CurrentDb.Execute "UPDATE tblInventory " & _
        " SET ICN = " & Me.txtICN & _
        ", manu = '" & Me.txtManu & "'" & _
        ", model = '" & Me.txtModel & "'" & _
        ", serial = '" & Me.txtSerial & "'" & _
        ", desc = '" & Me.txtDesc & "'" & _
        ", dateRec = '" & Me.txtDateRec & "'" & _
        ", dateRem = '" & Me.txtDateRem & "'" & _
        ", dispo = '" & Me.txtDispo & "'" & _
        ", project = '" & Me.txtProject & "'" & _
        ", AMCA = '" & Me.txtAMCA & "'" & _
        ", UL = '" & Me.txtUL & "'" & _
        ", comments = '" & Me.txtComments & "'" & _
        " WHERE ICN = " & Me.txtICN.Tag
    End If

    'clear form
    cmdClear_Click
    'refresh data in list on form
    frmInventorySub.Form.Requery
End Sub

Private Sub cmdClear_Click()
    Me.txtICN = ""
    Me.txtManu = ""
    Me.txtModel = ""
    Me.txtSerial = ""
    Me.txtDesc = ""
    Me.txtDateRec = ""
    Me.txtDateRem = ""
    Me.txtDispo = ""
    Me.txtProject = ""
    Me.txtAMCA = ""
    Me.txtUL = ""
    Me.txtComments = ""

    'focus on ID text box
    Me.txtICN.SetFocus
    'set button edit to enable
    Me.cmdEdit.Enabled = True
    'change caption of button add to Add
    Me.cmdAdd.Caption = "Add"
    'clear tag on txtICN for reset new
    Me.txtICN.Tag = ""
End Sub

Private Sub cmdClose_Click()
    DoCmd.Close
End Sub

Private Sub cmdDelete_Click()
    'delete record
    'check existing selected record
    If Not (Me.frmInventorySub.Form.Recordset.EOF And Me.frmInventorySub.Form.Recordset.BOF) Then
        'confirm delete
        If MsgBox("Are you sure you want to delete this item?", vbYesNo) = vbYes Then
            'delete now
            CurrentDb.Execute "DELETE FROM tblInventory " & _
                "WHERE ICN =" & Me.frmInventorySub.Form.Recordset.Fields("ICN")
            'refresh data in list
            Me.frmInventorySub.Form.Requery
        End If
    End If
End Sub

Private Sub cmdEdit_Click()
    'check whether there exists data in list
    If Not (Me.frmInventorySub.Form.Recordset.EOF And Me.frmInventorySub.Form.Recordset.BOF) Then
        'get data to text box control
        With Me.frmInventorySub.Form.Recordset
            Me.txtICN = .Fields("ICN")
            Me.txtManu = .Fields("manu")
            Me.txtModel = .Fields("model")
            Me.txtSerial = .Fields("serial")
            Me.txtDesc = .Fields("desc")
            Me.txtDateRec = .Fields("dateRec")
            Me.txtDateRem = .Fields("dateRem")
            Me.txtDispo = .Fields("dispo")
            Me.txtProject = .Fields("project")
            Me.txtAMCA = .Fields("AMCA")
            Me.txtUL = .Fields("UL")
            Me.txtComments = .Fields("comments")
            'store id of item in Tag of txtICN in case ICN is modified
            Me.txtICN.Tag = .Fields("ICN")
            'change caption of button add to Update
            Me.cmdAdd.Caption = "Update"
            'disable button edit
            Me.cmdEdit.Enabled = False
        End With
    End If
End Sub

以下是旧数据库的代码:

Option Compare Database

Private Sub cmdAdd_Click()
    'when we click on button Add there are two options
    '1. for insert
    '2. for update
    If Me.txtID.Tag & "" = "" Then
        'this is for insert new
        'add data to table
        CurrentDb.Execute "INSERT INTO tblEquipmentList(equipID, equipDesc, equipManu, equipModelNum, equipSerNum, lastCalDate, calDue) " & _
        " VALUES(" & Me.txtID & ", '" & Me.txtDesc & "', '" & Me.txtManu & "', '" & Me.txtModelNum & "', '" & Me.txtSerNum & "', '" & Me.txtLastCalDate & "', '" & Me.txtCalDueDate & "')"
    Else
        'otherwise (Tag of txtID store the id of equipment to be modified)
        CurrentDb.Execute "UPDATE tblEquipmentList " & _
        " SET equipID = " & Me.txtID & _
        ", equipDesc = '" & Me.txtDesc & "'" & _
        ", equipManu = '" & Me.txtManu & "'" & _
        ", equipModelNum = '" & Me.txtModelNum & "'" & _
        ", equipSerNum = '" & Me.txtSerNum & "'" & _
        ", lastCalDate = '" & Me.txtLastCalDate & "'" & _
        ", calDue = '" & Me.txtCalDueDate & "'" & _
        " WHERE equipID = " & Me.txtID.Tag
    End If

    'clear form
    cmdClear_Click
    'refresh data in list on form
    frmEquipmentListSub.Form.Requery
End Sub

Private Sub cmdClear_Click()
    Me.txtID = ""
    Me.txtDesc = ""
    Me.txtManu = ""
    Me.txtModelNum = ""
    Me.txtSerNum = ""
    Me.txtLastCalDate = ""
    Me.txtCalDueDate = ""

    'focus on ID text box
    Me.txtID.SetFocus
    'set button edit to enable
    Me.cmdEdit.Enabled = True
    'change caption of button add to Add
    Me.cmdAdd.Caption = "Add"
    'clear tag on txtID for reset new
    Me.txtID.Tag = ""
End Sub

Private Sub cmdClose_Click()
    DoCmd.Close
End Sub

Private Sub cmdDelete_Click()
    'delete record
    'check existing selected record
    If Not (Me.frmEquipmentListSub.Form.Recordset.EOF And Me.frmEquipmentListSub.Form.Recordset.BOF) Then
        'confirm delete
        If MsgBox("Are you sure you want to delete this piece of equipment?", vbYesNo) = vbYes Then
            'delete now
            CurrentDb.Execute "DELETE FROM tblEquipmentList " & _
                "WHERE equipID =" & Me.frmEquipmentListSub.Form.Recordset.Fields("equipID")
            'refresh data in list
            Me.frmEquipmentListSub.Form.Requery
        End If
    End If
End Sub

Private Sub cmdEdit_Click()
    'check whether there exists data in list
    If Not (Me.frmEquipmentListSub.Form.Recordset.EOF And Me.frmEquipmentListSub.Form.Recordset.BOF) Then
        'get data to text box control
        With Me.frmEquipmentListSub.Form.Recordset
            Me.txtID = .Fields("equipID")
            Me.txtDesc = .Fields("equipDesc")
            Me.txtManu = .Fields("equipManu")
            Me.txtModelNum = .Fields("equipModelNum")
            Me.txtSerNum = .Fields("equipSerNum")
            Me.txtLastCalDate = .Fields("lastCalDate")
            Me.txtCalDueDate = .Fields("calDue")
            'store id of equipment in Tag of txtID in case id is modified
            Me.txtID.Tag = .Fields("equipID")
            'change caption of button add to Update
            Me.cmdAdd.Caption = "Update"
            'disable button edit
            Me.cmdEdit.Enabled = False
        End With
    End If
End Sub

正如你所看到的,我非常有信心除了字段名称之外它们几乎完全相同。

我还在这里链接了数据库截图的专辑:http://imgur.com/a/xLV3Q

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:1)

问题可能是: 您的新表tblInventory有一个DESC列,它是一个SQL保留关键字。您有两种选择:

  1. 删除列DESC并创建一个名为OR的新列;
  2. 在您的脚本中添加括号,如下所示:INSERT INTO tblInventory([ICN], [manu], [model], [serial], [desc], [dateRec], [dateRem], [dispo], [project], [AMCA], [UL], [comments])
  3. 请查看SQL保留关键字的完整列表:Reserved Keywords-Transact-SQL