SQL / VB.NET Search-Function查找至少一个正确的输入

时间:2014-11-03 17:28:43

标签: sql vb.net visual-studio sqlite ms-access

我正在Visual Basic中编写一个关于数据库的程序。现在我有一个Sub / Function,它在数据库中搜索正确的输入。我有五个文本框,用户可以为每个数据字段添加内容。

If txtBox1.Text <> "" Or txtBox2.Text <> "" Or txtBox3.Text <> "" Or txtBox4.Text <> "" Or txtBox5.Text <> "" Then
        Try
            connection.Open()
            command.CommandText = "SELECT * from lager WHERE (lager_waren_id LIKE '" & txtBox1.Text & "' OR lager_warenanzahl LIKE '" & txtBox2.Text & "' OR lager_warenname LIKE '%" & txtBox3.Text & "%' OR lager_warengewicht LIKE '" & txtBox4.Text & "%' OR lager_waren_verkaufspreis LIKE '" & txtBox5.Text & "%');"
            reader = command.ExecuteReader()

            FormKunde.Enabled = True
            FormKunde.lstViewKundeStore.Items.Clear()
            Do While reader.Read()
                Dim lstViewItem As New ListViewItem(reader("lager_waren_id").ToString())
                lstViewItem.SubItems.Add(reader("lager_warenanzahl").ToString())
                lstViewItem.SubItems.Add(reader("lager_warenname").ToString())
                lstViewItem.SubItems.Add(reader("lager_warengewicht").ToString())
                lstViewItem.SubItems.Add(reader("lager_waren_verkaufspreis").ToString())
                FormKunde.lstViewKundeStore.Items.Add(lstViewItem)
            Loop
            reader.Close()
            FormKunde.Enabled = False
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try
        connection.Close()
    Else
        MessageBox.Show("Please fill in something in the text fields")
        Exit Sub
    End If

如果至少有一个文本字段有一些输入与它所属的数据字段匹配,那么我正在调用数据库。但是当我把东西放进去,无关紧要时,我的列表视图中没有任何反应。它只是在列表视图中加载所有数据。当我尝试“AND”而不是“OR”时,只有当我用一个数据集的正确数据填充所有文本字段时,它才有效。但我想,它找到所有数据集。 一个例子: 我有两个数据集,名称是“App”和“Apple”。当我在字段中填写“Ap”以获取名称时(其他内容没有)它向我展示了两者。我认为它应该与“OR”一起使用,但它什么都不做。

我真的很困惑如何解决这个问题,我希望有人猜测。谢谢!

2 个答案:

答案 0 :(得分:2)

您的问题是,当相关文本框中没有输入时,您的查询也始终使用所有条件。通过这种方式,您的LIKE变为LIKE '%%',当然,这与每条记录相匹配。

仅当文本框不为空或为空时才需要添加条件 因此,在检查文本框是否包含要搜索的任何值之后,您需要在部分中构建查询。

    connection.Open()
    Dim sql = "SELECT * from lager WHERE "
    if Not string.IsNullOrWhiteSpace(textBox1.Text) Then
        sql = sql & "lager_waren_id LIKE @p1 OR "
        command.Parameters.AddWithValue("@p1", textBox1.Text)
    End If
    if Not string.IsNullOrWhiteSpace(textBox2.Text) Then
        sql = sql & "lager_warenanzahl LIKE @p2 OR "
        command.Parameters.AddWithValue("@p2", textBox2.Text)
    End If
    if Not string.IsNullOrWhiteSpace(textBox3.Text) Then
        sql = sql & "lager_warenname LIKE @p3 OR "
        command.Parameters.AddWithValue("@p3", "%" & textBox3.Text & "%")
    End If
    if Not string.IsNullOrWhiteSpace(textBox4.Text) Then
        sql = sql & "lager_warengewicht LIKE @p4 OR "
        command.Parameters.AddWithValue("@p4", textBox4.Text & "%")
    End If
    if Not string.IsNullOrWhiteSpace(textBox5.Text) Then
        sql = sql & "lager_waren_verkaufspreis LIKE @p5 OR "
        command.Parameters.AddWithValue("@p5", textBox5.Text & "%")
    End If
    ' Remove the last OR if any ....'
    if sql.EndsWith(" OR ") then
       sql = sql.Substring(0, sql.Length - 4)
    End If
    ' Remove the WHERE if no textbox has been filled....'
    if sql.EndsWith(" WHERE ") then
       sql = sql.Substring(0, sql.Length - 7)
    End If
    command.CommandText = sql
    reader = command.ExecuteReader()

另请注意,您应该始终使用参数化查询来避免Sql Injection,尤其是当您直接从用户那里获得输入时。 (更不用说包含单引号的打字文本的问题)

答案 1 :(得分:0)

我希望我能正确理解你的问题。我确信有更好的方法可以做到这一点,我的VB生锈了,但这样的事情可能会起作用

Dim query As String = "SELECT * FROM lager"

Function addField (ByVal query As String, ByVal value as String, ByVal field as String) As String
addField = query    
If value <> "" Then
    If query.IndexOf("where", 0, StringComparison.CurrentCultureIgnoreCase) > -1 Then
        addField = query & " AND " & field & " LIKE '%" & value & "%'"
    Else
        addField = query & " WHERE " & field & " LIKE '%" & value & "%'"
    End If
End If
End Function

query = addField(query, txtBox1.Text, "lager_waren_id")
query = addField(query, txtBox2.Text, "lager_warenanzahl")
'...continue adding fields...'

command.CommandText = query

这应该使您的查询字符串只包含填充的字段