如何实现更高效的搜索功能?

Stu*_*ent 6 mysql sql database vb.net

在我的数据库中有3列,分别是姓名,年龄,性别.在程序中,我只想使用1个搜索按钮.单击该按钮时,程序将确定文本框中的哪3个输入并搜索正确的数据.

你如何使用查询?例如,如果Name和Gender有文本,则查询:

" Select * from table Where (Name = @name) AND (Gender = @gender)"

当只输入名称时,我只查询名称.我是否必须按文本框检查文本框是否有用户输入,然后为每个文本框写入多个查询?或者有更好的方法吗?

编辑(29/5/16):我尝试这样做另一种方式

myCommand = New MySqlCommand("Select * from project_record Where
                       (FloatNo = @floatNo OR FloatNo = 'None') AND 
                       (DevCompanyName = @devCompanyName OR DevCompanyName = 'None') AND 
                       (DevType = @devType OR DevType = 'None') AND 
                       (LotPt = @lotPt OR LotPt = 'None') AND
                       (Mukim = @mukim OR Mukim = 'None') AND
                       (Daerah = @daerah OR Daerah = 'None') AND
                       (Negeri = @negeri OR Negeri = 'None') AND
                       (TempReference = @tempRef OR TempReference = 'None')", sqlConn)
Run Code Online (Sandbox Code Playgroud)

但是正如你可以猜到的那样它也不会有效地工作,因为如果我只输入输入DevType并将其他文本框留空,则查询不会仅提取所有记录DevType.它只会显示为无记录.

Rob*_*zie 2

原答案

(向下滚动查看更新)

您可以尝试以下操作:

  • 构建一个仅包含具有输入的文本框的值的列表
  • 设置一个字符串,将该列表的项目与“ AND ”字符串连接在一起
  • 将该字符串附加到标准 SELECT 语句中

代码如下所示:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    Dim Predicate1 As String = Me.TextBox1.Text
    Dim Predicate2 As String = Me.TextBox2.Text
    Dim Predicate3 As String = Me.TextBox3.Text
    Dim PredicateList As New List(Of String)
    Dim WhereClause As String
    Dim Query As String

    If Predicate1 <> String.Empty Then
        PredicateList.Add("Name=""" & Predicate1 & """")
    End If
    If Predicate2 <> String.Empty Then
        PredicateList.Add("Age=""" & Predicate2 & """")
    End If
    If Predicate3 <> String.Empty Then
        PredicateList.Add("Gender=""" & Predicate3 & """")
    End If

    WhereClause = String.Join(" AND ", PredicateList.ToArray)
    Query = "SELECT * FROM TABLE WHERE " & WhereClause
    MessageBox.Show(Query)

End Sub
Run Code Online (Sandbox Code Playgroud)

更新

除了有关 SQL 注入的评论之外,这里还有一个更新的示例。

Dim Command As SqlClient.SqlCommand
Dim Predicate1 As String = Me.TextBox1.Text
Dim Predicate2 As String = Me.TextBox2.Text
Dim Predicate3 As String = Me.TextBox2.Text
Dim ParameterList As New List(Of SqlClient.SqlParameter)
Dim PredicateList As New List(Of String)
Dim BaseQuery As String = "SELECT * FROM TABLE WHERE "

If Predicate1 <> String.Empty Then
    PredicateList.Add("name = @name")
    ParameterList.Add(New SqlClient.SqlParameter("@name", Predicate1))
End If
If Predicate2 <> String.Empty Then
    PredicateList.Add("age = @age")
    ParameterList.Add(New SqlClient.SqlParameter("@age", Predicate2))
End If
If Predicate3 <> String.Empty Then
    PredicateList.Add("gender = @gender")
    ParameterList.Add(New SqlClient.SqlParameter("@gender", Predicate3))
End If

Command = New SqlClient.SqlCommand(BaseQuery & String.Join(" AND ", PredicateList.ToArray))
Command.Parameters.AddRange(ParameterList.ToArray)
Run Code Online (Sandbox Code Playgroud)

  • 我不敢相信这是被接受的答案!您不应该*永远*将查询文本与用户输入连接起来!这是严重的安全漏洞,因为它为 SQL 注入打开了大门。*始终使用参数将值传递给命令!* 醒醒吧,现在是 2016 年了! (3认同)
  • 是的,它确实。此外,尝试过滤/查找像“O'Brian”或“D'Artagnan”这样的名称,它会崩溃。 (2认同)