尽管SQL字符串在查询生成器中正常运行,但使用CurrentDb.Execute(sqlStr)时出错

时间:2015-08-25 15:04:01

标签: sql vba ms-access access-vba

我正在构建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

2 个答案:

答案 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]