我正在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”一起使用,但它什么都不做。
我真的很困惑如何解决这个问题,我希望有人猜测。谢谢!
答案 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
这应该使您的查询字符串只包含填充的字段