我有一个组合框(cbo1
),其中列出了可用的项目。当我在cbo1
中选择一项时,我希望将其复选框更改为True(或Yes)。
cbo1
从tblLOG
获取数据,其中Box(复选框)为“否”查询
我尝试使用
UPDATE tblLOG
Set Box = True
WHERE Serial = cboSerial
实际代码。
Private Sub cbo1_Change()
Dim strSQL As String
Dim i As Integer
Dim Msg As String
Dim Assm As String
Assm = cbo1.Value
'Exit this sub if the combo box is cleared
Msg = "Make Update" & vbCr & vbCr
i = MsgBox(Msg, vbQuestion + vbYesNo, "UPDATE VALUE?")
If i = vbYes Then
strSQL = "UPDATE tblLOG " _
& "SET Box= True " _
& "WHERE Serial = Assm;"
CurrentDb.Execute strSQL, dbFailOnError
Response = acDataErrAdded
End If
End Sub
我的结果是
运行时错误'3061':参数太少。预期为1。
答案 0 :(得分:1)
发生错误的原因是因为您不是在评估VBA变量Assm
,而是将字符串"Assm"
连接到SQL查询。
strSQL = "UPDATE tblLOG " _
& "SET Box= True " _
& "WHERE Serial = Assm;"
如果要将Debug.Print
变量strSQL
移至控制台,则会看到字符串:
"UPDATE tblLOG SET Box= True WHERE Serial = Assm;"
但是,由于Assm
不是SQL查询中的字符串(即,它没有被单引号或双引号引起来),因此它将被解释为在SQL查询中未提供其值的参数。随后执行。
要解决此问题,您可以将Assm
变量的求值连接起来,例如:
strSQL = "UPDATE tblLOG " _
& "SET Box= True " _
& "WHERE Serial = '" & Assm & "';"
这假设Serial
是一个文本字段-如果不是这种情况,请删除上面的单引号。
您的整个代码可以精简为:
Private Sub cbo1_Change()
If MsgBox("Make Update", vbQuestion + vbYesNo, "UPDATE VALUE?") = vbYes Then
CurrentDb.Execute "update tbllog set box = true where serial = '" & cbo1 & "';", dbFailOnError
Response = acDataErrAdded
End If
End Sub
尽管如此,SQL injection仍然可以使用,因此更好的做法是parameterise the query,例如:
With CurrentDb.CreateQueryDef("", "update tbllog t set t.box = true where t.serial = myserial;")
.Parameters!myserial = cbo1
.Execute
End With