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
- 洛杉矶
- 纽约
- 伦敦
- 柏林
- 阿姆斯特丹
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