复选框是/否更改Dropbox的更改

时间:2019-05-28 14:06:02

标签: ms-access access-vba ms-access-2010 ms-access-forms

我有一个组合框(cbo1),其中列出了可用的项目。当我在cbo1中选择一项时,我希望将其复选框更改为True(或Yes)。

cbo1tblLOG获取数据,其中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。

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