将Textbox字符串传递给SQL Query

时间:2014-02-27 19:02:10

标签: vb.net

我正在尝试从我的aspx页面中的文本框中输入我输入的文本并将其传递给我的数据库以进行查询,但我没有任何错误。当我提出一个断点时,我的ElseIf部分不会评估。我哪里做错了?

Protected Sub SearchButton_Click(ByVal sender As Object, ByVal e As EventArgs) Handles SearchButton.Click
    Dim DS As New DataSet

    If SearchTextBox.Text = "" Or NameSearchTextBox.Text = "" Then
        DS = RunQuery("SELECT * FROM tblFiles WHERE Status = '" & radiolist1.SelectedValue & "'")
        GridView1.DataSource = DS
        GridView1.DataBind()
        If radiolist1.SelectedValue = "*" Then
            BindGrid()
        End If
    ElseIf SearchTextBox.Text.Length >= 1 Then
        DS = RunQuery("SELECT * FROM tblFiles WHERE Number like '%" & SearchTextBox.Text & "%'")
        GridView1.DataSource = DS
        GridView1.DataBind()
    ElseIf NameSearchTextBox.Text.Length >= 1 Then
        DS = RunQuery("SELECT * FROM tblFiles WHERE Member like '%" & NameSearchTextBox.Text & "%'")
        GridView1.DataSource = DS
        GridView1.DataBind()
    End If

End Sub

谢谢!

2 个答案:

答案 0 :(得分:1)

您可能希望将第一个if条件移到另外两个以下。现在的方式是,如果NameSearchTextbox或SearchTextbox为空,则使用radiolist进行查询。这意味着你必须在SearchTextBox和NameSearchTextbox中都有一个值才能超越radiolist条件。在这种情况下,它将使用SearchTextbox查询,并且永远不会使用NameSearchTextbox查询。

像这样:

If SearchTextBox.Text.Length >= 1 Then
    DS = RunQuery("SELECT * FROM tblFiles WHERE Number like '%" & SearchTextBox.Text & "%'")
    GridView1.DataSource = DS
    GridView1.DataBind()
ElseIf NameSearchTextBox.Text.Length >= 1 Then
    DS = RunQuery("SELECT * FROM tblFiles WHERE Member like '%" & NameSearchTextBox.Text & "%'")
    GridView1.DataSource = DS
    GridView1.DataBind()
Else
    DS = RunQuery("SELECT * FROM tblFiles WHERE Status = '" & radiolist1.SelectedValue & "'")
    GridView1.DataSource = DS
    GridView1.DataBind()
    If radiolist1.SelectedValue = "*" Then
        BindGrid()
    End If
End If

或者,只需将OR更改为AND即可。

答案 1 :(得分:0)

(我很抱歉没有把这个作为评论而不是答案。我仍然建立声誉所以我不能发表评论,但是觉得这一点非常重要,无论如何都要提到。如果它仍然不合适,请随意删除!)

只是想提出一些友好的建议!无论何时将文本直接从网页放入SQL语句,防御SQL注入攻击都至关重要。如果有人要在你的NameSearchTextBox中键入'; DROP TABLE tblFiles --,它可能会摆脱你的桌子!

Microsoft Patterns and Practices website上有一篇陈旧但仍然相关的文章讨论了一些解决方案。最简单的解决方案就是将输入文本包装在函数调用中,如

DS = RunQuery("SELECT * FROM tblFiles WHERE Member like '%" & StringToSQL(NameSearchTextBox.Text) & "%'")

StringToSQL()看起来像

'Sanitize SQL input to defend against injection attacks
Public Shared Function StringToSQL(rawString As String) As String
    If rawString Is Nothing Then Return Nothing 'ignore null strings
    Return rawString.Replace("'", "''")  'Make SQL treat a single quote as a literal
End Function