2

我在 Visual Studio 中创建了一个数据库,并且正在使用 VB.net 进行编码。我创建了文本框和复选框,以匹配按下搜索按钮时每个将搜索的字段。

每当我使用文本框和复选框执行搜索时,我都会收到错误消息。 Item Name, Room, Broken, In Use, ,分别是, , , floor, 中的文本搜索的字段....etcNameSearchRoomSearchBrokenSearchareInUseSearchFloorSearch

这是搜索按钮的代码

    Private Sub SearchButton_Click(sender As Object, e As EventArgs) Handles SearchButton.Click

    RecordDataGridView.Refresh()
    Me.RecordBindingSource.Filter = "[Item Name]= '" & NameSearch.Text & "' And  [Room]= '" & RoomSearch.Text & "' And  [Make]= '" & MakeSearch.Text & _
        "' And  [Broken]= '" & BrokenSearch.CheckState & "' And  [Replaced]= '" & ReplacedSearch.CheckState & "'And [ID#]= '" & IdentificationNumberSearch.Text & _
        "' And   [Floor]= '" & FloorSearch.Text & "' And   [In Use]= '" & InUseSearch.CheckState & "'"
    Me.RecordTableAdapter.Fill(Me.MLGDatabaseDataSet.Record)
    RecordDataGridView.Refresh()

End Sub

数据区

搜索区域

错误

例如,我在项目 nameSearch 和 floorSearch 中输入文本并按搜索,不会出现任何结果,因为其他文本框中没有文本。

4

2 回答 2

2

在不解决其他问题的情况下,例如使用参数化查询来防止 SQL 注入或使用 StringBuilder 更有效地执行连接,我相信您的问题可能是此代码段中缺少空格:

ReplacedSearch.CheckState & "'And [ID#]= '"

如果你把它改成

ReplacedSearch.CheckState & "' And [ID#]= '"

它可以解决直接错误。但是,您几乎可以肯定在中间的 OR 语句中引入了额外的逻辑错误(您可能希望用括号括住两个用括号进行 OR 的子句)。

于 2013-07-13T01:46:39.583 回答
0

我发现了与@competent_tech 相同的东西。我会以这种方式设置它以使其更易于调试。

    Dim strFilter As String = _
            "[Item Name]= '" & NameSearch.Text & _
            "' And  [Room]= '" & RoomSearch.Text & _
            "' And  [Make]= '" & MakeSearch.Text & _
            "' And  [Broken]= '" & BrokenSearch.CheckState & _
            "' Or  [Replaced]= '" & ReplacedSearch.CheckState & _
            "' And [ID#]= '" & IdentificationNumberSearch.Text & _
            "' And   [Floor]= '" & FloorSearch.Text & _
            "' And   [In Use]= '" & InUseSearch.CheckState & "'"
    Debug.Print(strFilter)
    RecordBindingSource.Filter = strFilter

编辑:您只想在给定条件时过滤

    'filter string
    Dim strFilter As String = ""

    'for check boxes you probably want to filter only if checked
    If BrokenSearch.CheckState = CheckState.Checked Then strFilter += "And [Broken]= " & BrokenSearch.CheckState & " "
    If ReplacedSearch.CheckState = CheckState.Checked Then strFilter += "And [Replaced]= " & ReplacedSearch.CheckState & " "
    If InUseSearch.CheckState = CheckState.Checked Then strFilter += "And [In Use]= " & InUseSearch.CheckState & " "

    'for text boxes you want to filter only if has text
    If IdentificationNumberSearch.Text.Length > 0 Then strFilter += "And [ID#]= '" & IdentificationNumberSearch.Text & "' "
    If FloorSearch.Text.Length > 0 Then strFilter += "And [Floor]= " & FloorSearch.Text & " "
    If RoomSearch.Text.Length > 0 Then strFilter += "And [Room]= " & RoomSearch.Text & " "
    If MakeSearch.Text.Length > 0 Then strFilter += "And [Make]= '" & MakeSearch.Text & "' "
    If NameSearch.Text.Length > 0 Then strFilter += "And [Item Name]= '" & NameSearch.Text & "' "

    'check to make sure there is at least one condition
    If strFilter.Length > 0 Then

        'remove the first "And"
        strFilter = strFilter.Remove(0, 4)

        'output
        Debug.Print(strFilter)

        'set to filter
        RecordBindingSource.Filter = strFilter
    End If

编辑:您的错误“无法对 System.Boolean 和 System.String 执行 '=' 操作”我认为问题在于过滤器值必须与字段类型匹配。

对于字符串,这样做:[Make] = 'stringValue'使用单引号;对于整数这样做:[Floor] = 24没有单引号;对于位这样做:[Broken] = 1没有单引号;

看起来 Broken、Replaced 和 In Use 是数据库中的位类型。我猜 Floor 和 Room 是整数。

于 2013-07-13T01:55:57.160 回答