Asp.net 从复选框列表在VB.net中创建SQL查询

Asp.net 从复选框列表在VB.net中创建SQL查询,asp.net,sql,vb.net,checkboxlist,Asp.net,Sql,Vb.net,Checkboxlist,我有一个复选框列表,并从数据库中动态填充它。例如,在填充复选框列表后,如下所示: 洛杉矶 纽约 伦敦 柏林 阿姆斯特丹 我想根据选中的复选框创建SQL查询。如果我只想选择一个城市(例如,仅纽约),我希望结果为: (城市=2) 这很正常,但当我有多个城市(如纽约、伦敦和阿姆斯特丹)时,我希望结果是: (城市=2)或(城市=3)或(城市=5) 或者,如果我选择洛杉矶和柏林,我希望结果如下: (城市=1)或(城市=4) 我怎样才能做到这一点?下面是我的代码,但我被累坏了。有什么想法吗 Protec

我有一个复选框列表,并从数据库中动态填充它。例如,在填充复选框列表后,如下所示:

  • 洛杉矶
  • 纽约
  • 伦敦
  • 柏林
  • 阿姆斯特丹
我想根据选中的复选框创建SQL查询。如果我只想选择一个城市(例如,仅纽约),我希望结果为:

(城市=2)

这很正常,但当我有多个城市(如纽约、伦敦和阿姆斯特丹)时,我希望结果是:

(城市=2)或(城市=3)或(城市=5)

或者,如果我选择洛杉矶和柏林,我希望结果如下:

(城市=1)或(城市=4)

我怎样才能做到这一点?下面是我的代码,但我被累坏了。有什么想法吗

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim var As String = ""
    Dim counter As Integer = 0
    Dim myList As New List(Of String)()
    For i As Integer = 0 To CheckBoxList1.Items.Count - 1
        If CheckBoxList1.Items(i).Selected Then
            myList.Add(i + 1)
            counter = counter + 1
            If counter = 1 Then
                var = "(City =" & i + 1 & ")"
            Else
                Console.WriteLine(myList(1))
                Dim myArray As String() = myList.ToArray()
                For j As Integer = 1 To myArray.Length
                    Dim var2 As String = " OR (City =" & counter & ")"
                    var = "(City =" & myArray(0) & ")" & var2
                Next
            End If
        End If
    Next
    SQL = "SELECT * FROM Data1 WHERE (" & var & ") ORDER BY [ID]"
    Session("Search") = SQL
    Server.Transfer("Data_Form.aspx")
End Sub

我最强烈的建议是查看表值参数:

这将修复您的问题并帮助您避免sql注入漏洞

但是,如果您确实坚持使用字符串连接,请尝试使用
IN()
条件,在该条件下,您将得到类似于
CITY IN(1,2)
的结果,而不是
(CITY=1或CITY=2)
。通过使用未使用的ID开头,您可以使其更易于编写,如下所示:

Dim cityClause As String=“CITY IN(-1{0})”以有效子句开头
Dim CITYID As String=“”
对于复选框List1.Items.Where中的每个框作为ListItem(功能(b)b.选定)
'尝试在每个列表项的值部分存储每个城市的ID,
'而不是使用索引顺序
cityIDs=cityIDs&“,”和box.Value
下一个盒子
cityClause=string.Format(cityClause,cityid)
您可以在(2,3,5)中使用
城市,而不是
(城市=2)或(城市=3)或(城市=5)


您现在所做的事情容易受到sql注入攻击。请了解查询参数。特别是能立即帮助您的是表值参数。@JoelCoehoorn这是有价值的输入,但鉴于
var
变量似乎从未包含最终用户输入,它并没有那么容易受到攻击。此外,使用参数构建自定义where条件更加困难。@RacilHilan该技术通常容易受到攻击,仅出于良好实践,应在任何地方避免使用。@Crono TVPs是在SQL Server 2008中引入的。@Crono我同意你的看法,但Joel既没有提供解释,也没有提供“可行的解决方案”。他提出使用价值而不是索引,没有任何解释。如果OP没有设置该值,我们怎么能假设该值包含任何内容?是的,OP要求的是一个有效的解决方案,而不是讲座,但乔尔的回答(和评论)更像是一个缺乏解释的讲座,而且肯定不是一个有效的解决方案。@RacilHilan啊,你说得对,我现在明白了。是的,他使用的是
box.Value
,是的,这可能不合适。@JoelCoehoorn我建议您编辑您的答案,以便解释为什么以及如何使用
box.Value
,或者使用组合框项索引。
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim condition As String = ""
    For i As Integer = 0 To CheckBoxList1.Items.Count - 1
        If CheckBoxList1.Items(i).Selected Then
            condition = condition & "," & (i + 1)
        End If
    Next
    SQL = "SELECT * FROM Data1 WHERE (" & condition.SubString(1) & ") ORDER BY [ID]"
    Session("Search") = SQL
    Server.Transfer("Data_Form.aspx")
End Sub