【问题标题】:Syntax error of SQL insert statement in accessaccess中SQL插入语句的语法错误
【发布时间】:2023-04-08 10:44:01
【问题描述】:

我正在做一个表单设计,我希望用户从组合框中选择购买项目并输入单价和购买数量。用户选择和输入的所有信息都将添加到另一个表中。这里我使用 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

【问题讨论】:

  • 我发现了一个错误。在 OrderStatus 之后错误地键入了一个额外的逗号“,”。这就是错误信息。令我惊讶的是,Me!cboSupplierCompany 和 Me.Controls("cboPurchaseItem" & i) 中的数据无法添加到显示为空白的表格中。

标签: sql loops ms-access syntax insert


【解决方案1】:

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

对于组合框空白时失败,可能是由于VBA空字符串不能作为字符串文字在查询中传递。要解决此问题,请尝试在组合框为空时使用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

【讨论】:

    猜你喜欢
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 2016-06-10
    • 2012-04-07
    相关资源
    最近更新 更多