访问中SQL插入语句的语法错误

时间:2016-07-04 18:04:17

标签: sql loops ms-access syntax insert

我正在进行表单设计,我希望用户从组合框中选择购买项目并输入单价和购买数量。用户选择和输入的所有信息都将添加到另一个表中。在这里,我使用Do Until Loop逐个添加购买记录。我尝试了Do Until Loop。它运作良好。但是,当我结束时,这个循环使用Insert Into语句我收到了语法错误。请帮我查一下问题所在。谢谢。

我的代码:

Private Sub Command133_Click()
Dim i As Integer
i = 1
Do Until IsNull(Me.Controls("cboPurchaseItem" & i))
  Dim StrSql As String
    StrSql = "Insert Into test2 (PurchaseID,
                                PurchaseDate, 
                                ExpectedDeliveryDate, 
                                Supplier, 
                                PurchaseItem,
                                Unit, 
                                PurchaseQuantity, 
                                UnitCost, 
                                OrderStatus,)" & _
            " VALUES('" & Me!txtOrderID & "',
                     #" & Format(Me!txtOrderDate, "yyyy/mm/dd") & "#,
                     #" & Format(Me!txtDeliveryDate, "yyyy/mm/dd") & "#,
                    '" & Me!cboSupplierCompany & "', 
                    '" & Me.Controls("cboPurchaseItem" & i) & "', 
                    '" & Me.Controls("txtUnit" & i) & "',
                    " & CStr(Me.Controls("TxtQty" & i)) & ",
                    " & CStr(Me.Controls("TxtPrice" & i)) & ",
                    'Ordered')"
    CurrentDb.Execute (StrSql)
MsgBox " You have successfully added " & i & " records to the PurchaseOrderDetail table."
i = i + 1
Loop
End Sub

1 个答案:

答案 0 :(得分:0)

使用querydef对象考虑参数化SQL查询(现代编程中的最佳实践),避免使用引号或数字来包含值。只需在string语句顶部添加PARAMETERS子句,然后在循环中迭代绑定值。

对于空白时失败的组合框,可能是由于VBA nullstring无法在查询中作为字符串文字传递。要解决此问题,请尝试使用Nz()函数在组合框为空时返回零​​长度字符串值。

Dim qdef As Querydef
Dim i As Integer: i = 1 
Dim StrSql As String

' PREPARE SQL STATEMENT '
StrSql = "PARAMETERS [PIDParam] Integer, [PDateParam] Datetime," _
           & " [EDDateParam] Datetime, [SupplierParam] Text(255)," _
           & " [PItemParam] Text(255), [UnitParam] Text(255), [PQtyParam] Long," _
           & " [UnitCostParam] Double, [OrderStatusParam] Text(255);" _
           & " INSERT INTO test2 (PurchaseID, PurchaseDate," _
           & "                    ExpectedDeliveryDate, Supplier, PurchaseItem, Unit," _
           & "                    PurchaseQuantity, UnitCost, OrderStatus)" _
           & " VALUES ([PIDParam], [PDateParam], [EDDateParam]," _
           & "         [SupplierParam], [PItemParam], [UnitParam], [PQtyParam]," _
           & "         [UnitCostParam], [OrderStatus]);"

Do Until IsNull(Me.Controls("cboPurchaseItem" & i)) 
     ' INITIALIZE QDEF '
     Set qdef = CurrentDb.CreateQyerydef("", StrSqL)

     ' BIND PARAMETERS TO STATEMENT '
     qdef!PIDParam = Me!txtOrderID
     qdef!PDateParam = Me!txtOrderDate
     qdef!EDDatePram = Me!txtDeliveryDate
     qdef!SuppierPram = Nz(Me!cboSupplierCompany)
     qdef!PItemParam = Nz(Me.Controls("cboPurchaseItem" & i))
     qdef!UnitParam = Me.Controls("txtUnit" & i)
     qdef!PQtyParam = CStr(Me.Controls("TxtQty" & i))
     qdef!UnitCostParam = CStr(Me.Controls("TxtPrice" & i))
     qdef!OrderStatusParam = "Ordered"

    ' EXECUTE APPEND QUERY '
     qdef!Execute dbFailOnError
     i = i + 1
Loop

MsgBox "You have successfully added " & i _
         & " records to the PurchaseOrderDetail table.", vbInformation, "APPEND SUCCESS"

Set qdef = Nothing