我正在构建MS Access数据库,但无法在任何地方找到解决我问题的方法。我想要做的就是在单击按钮时使用SQL代码触发对表的更新,但是,每次我尝试运行此代码时都会收到错误:“运行时错误3061,参数太少。预期1”。我在SQL代码中调用的所有表和字段的命名是正确的。我将调试打印中的SQL字符串复制/粘贴到查询构建器中,它可以正常工作。我的代码是:
Private Sub cmdAddRev_Click()
Dim compNum As String
Dim docPath As String
Dim filePath As String
Dim lastRev As Integer
Dim updateRev As Integer
Dim sqlStr As String
compNum = Me.cboRevSelection.Value
docPath = Me.tboRevDocLoc.Value
filePath = Me.tboRevFileLoc.Value
lastRev = DLookup("numLastRev", "tblComponents", "num = [Forms]![frmRevisor]![cboRevSelection]")
updateRev = lastRev + 1
sqlStr = " UPDATE tblComponents "
sqlStr = sqlStr & " SET numLastRev = " & updateRev
sqlStr = sqlStr & " WHERE num = [Forms]![frmRevisor]![cboRevSelection] "
CurrentDb.Execute (sqlStr) 'this line is flagged when the error happens
Debug.Print sqlStr
End Sub
答案 0 :(得分:1)
更改此行:
sqlStr = sqlStr & " WHERE num = [Forms]![frmRevisor]![cboRevSelection] "
到此:
sqlStr = sqlStr & " WHERE num = '" & [Forms]![frmRevisor]![cboRevSelection] & "'"
来自VBA的SQL,不喜欢参数。始终在引号之外使用引用,以便执行的查询中已包含值。 (尽管使用参数化查询会更好......)
答案 1 :(得分:0)
通过VBA执行SQL时,无法引用表单。有几种选择。将tempvar设置为所需的值并引用SQL中的tempvar或创建引用表单的公共函数并使用SQL中的函数
Public Function RevSelection()
RevSelection = [Forms]![frmRevisor]![cboRevSelection]
End Function
然后使用
sqlStr = sqlStr & " WHERE num = RevSelection()"
或者,最简单的,将其作为值引用。
sqlStr = sqlStr & " WHERE num =" & [Forms]![frmRevisor]![cboRevSelection]