【问题标题】:Search using multiple criteria使用多个条件进行搜索
【发布时间】:2025-12-01 05:05:01
【问题描述】:

我有两个要搜索表格的文本框。我正在通过一个我认为是问题的查询进行搜索。代码应该从两个文本框中获取标准并搜索一个表。之后,其余的文本框将填充最接近搜索的记录集。

我在RstRecSet.MoveLast 收到一个错误我收到一个编译错误,说没有当前记录。我确实有一个记录,就像我在框中输入的内容一样,但它没有捡起它

当我添加记录的确切名称时,它发现没有问题。就好像它把 like 运算符当作 = 一样对待。

这是我的代码:

Private Sub Command514_Click()
'DoCmd.Close
'DoCmd.OpenForm "frmContacts", acNormal
    Set RstRecSet = Nothing
    Set db = CurrentDb
    Dim searchNum As String
    Dim searchName As String
    searchNum = txtGroupNr
    searchName = txtGroupName
 On Error Resume Next
If IsNull(txtGroupNr) Or txtGroupNr = "" Then

        Me.txtGroupName.BackColor = vbRed
        Forms!frmGroupHeader!txtGroupNr.SetFocus

    Else
        'strSearchICN = txtGroupNr
        Set db = CurrentDb
        Me.txtGroupName.BackColor = vbWhite
        Set RstRecSet = db.OpenRecordset("Select * from tblGroupHeader Where GroupNum  Like '" & searchNum & "' And GroupName  Like '" & searchName & "';", dbOpenDynaset)
        RstRecSet.MoveLast
        intMaxCount = RstRecSet.RecordCount
        RstRecSet.MoveFirst
      ' Exit Sub
   End If

     If RstRecSet.EOF Then


        Me.txtGroupName.BackColor = vbRed
        Forms!frmGroupHeader!txtGroupNr.SetFocus

    Else
       Call DisplayFields

    End If
End Sub

这里是解决方案

    Private Sub Command514_Click()
'DoCmd.Close
'DoCmd.OpenForm "frmContacts", acNormal
    Set RstRecSet = Nothing
    Set db = CurrentDb
    Dim searchGroup As String
    Dim searchName As String

If IsNull(txtgroupSearch) Or txtgroupSearch = "" Then

        Me.txtGroupName.BackColor = vbRed
        Forms!frmGroupHeader!txtGroupNr.SetFocus

    Else
        'searchNum = txtGroupNr
        searchGroup = txtgroupSearch

        Set db = CurrentDb
        Me.txtGroupName.BackColor = vbWhite
        Set RstRecSet = db.OpenRecordset("Select * from tblGroupHeader Where groupName like '*" & searchGroup & "*' or groupNum like '*" & searchGroup & "*';", dbOpenDynaset)
            If RstRecSet.EOF And RstRecSet.BOF Then
            MsgBox ("NO RECORDS!")
                Exit Sub
            End If
        RstRecSet.MoveLast
        intMaxCount = RstRecSet.RecordCount
        RstRecSet.MoveFirst
      ' Exit Sub
   End If

     If RstRecSet.EOF Then
        Me.txtGroupName.BackColor = vbRed
        Forms!frmGroupHeader!txtGroupNr.SetFocus

    Else
        Call DisplayFields

    End If
End Sub

【问题讨论】:

  • 人们想知道 SQL 注入如何仍然是第一大安全风险......
  • 我在 RstRecSet.MoveLast 收到一个错误,我收到一个编译错误,说没有当前记录。我确实有一个记录,就像我在盒子里输入的一样,但它没有捡起来。
  • 首先我要感谢所有回复并帮助我的人,我真的很感激。响应 HansUp,我添加了 Option Explicit,它帮助我在我的 sql 查询中找到错误。不幸的是,我得到了相同的运行时错误“没有当前记录”。

标签: sql ms-access vba


【解决方案1】:

我相信问题出在您的 SQL 中。该错误表明您没有记录。在记录集上调用 .MoveLast 之前,您可以进行快速测试:

If RstRecSet.EOF and RstRecSet.BOF Then 
    msgbox("NO RECORDS!")
    exit sub
End if

回到 SQL。你写了"Select * from tblGroupHeader Where GroupNum and GroupName Like '" & searchNum & GroupName & "';",如果你选择“1”作为GroupNum,选择“Physics”作为Groupname,就会变成Select * from tblGroupHeader Where GroupNum and GroupName Like '1Physics';这样没有意义

改为:"Select * from tblGroupHeader Where GroupNum Like '" & searchNum & "' and GroupName Like '" & GroupName & "';" 看起来像 Select * from tblGroupHeader Where GroupNum Like '1' and GroupName Like 'Physics';

我发现先将我的 SQL 放入一个变量,然后使用 Debug.Print SQL 将该变量写入即时窗口很有帮助,这样我就可以复制并粘贴回我的数据库,以确保一切正常感觉。

【讨论】:

  • 嘿 JNevill,感谢您的回复,这非常有帮助。我觉得我们离解决方案越来越近了。您编写的代码块有效,但它只是用消息框替换运行时错误。我正在输入我知道存在的记录,但由于某种原因它没有收到。当我添加记录的确切名称时,它发现没有问题。就好像它把 like 运算符当作 = 一样对待。
  • 您是否也检查了您的 SQL 语句?我相信,这是您问题的核心。
  • 这是我的查询,我没有看到问题,但也许我错过了一些东西。 db.OpenRecordset("Select * from tblGroupHeader Where GroupNum Like '" & searchNum & "' And GroupName Like '" & searchName & "';", dbOpenDynaset)
  • 您实际上是否有一个指向特定记录的 searchNum 和 searchName 值?那应该是 OR 吗?您是否正在尝试通配符搜索而不仅仅是一个“=”,这是您 LIKE 目前正在做的所有事情......也许您的意思是GroupNum like '" & searchNum & "' OR GroupName like '*" & searchName & "*';" - 问题仍然存在于您的 SQL 语句中,因为您正在轰炸代码时它没有记录。
  • 太奇怪了,还是把like当作=。