2

Visual Studioでデータベースを作成し、VB.netでコーディングしています。検索ボタンが押されたときにそれぞれが検索するフィールドに一致するテキストボックスとチェックボックスを作成しました。

テキストボックスとチェックボックスを使用して検索を実行すると、エラーが発生します。 Item Name, Room, Broken, In Use,は、 , , ,floor内のテキストによってそれぞれ検索されるフィールドです....NameSearchRoomSearchBrokenSearchareInUseSearchFloorSearch

これは検索ボタンのコードです

    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

データ領域

検索エリア

エラー

たとえば、item nameSearch と floorSearch にテキストを入力して検索を押しても、他のテキスト ボックスにはテキストが含まれていないため、結果は表示されません。

4

2 に答える 2

2

パラメーター化されたクエリを使用して SQL インジェクションを防止したり、StringBuilder を使用してより効率的に連結を実行したりするなど、他の問題に対処しなければ、このスニペットのスペースが不足している可能性があると思います。

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

これを次のように変更すると

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

すぐにエラーが解決する場合があります。ただし、途中の OR ステートメントによって追加の論理エラーが発生することはほぼ確実です (おそらく、OR で結合された 2 つの句を括弧で囲みます)。

于 2013-07-13T01:46:39.583 に答える
0

@Compentent_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 は Integer だと思います。

于 2013-07-13T01:55:57.160 に答える