【发布时间】:2011-01-31 05:37:04
【问题描述】:
我正在寻找示例脚本。我昨天看到了一个,但为了我的一生,我今天再也找不到了。
我的任务是允许用户通过 aspx 页面上的输入控件搜索 1 个数据库表,他们可以在其中选择和,或,等于组合字段,使用 concat/stringbuilder 或类似工具即时生成 sql。 (它在公司防火墙后面运行)
请有人指出示例或教程的正确方向
我一直在处理该页面,但遇到了问题。这是Page_load;
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim sql As String = ("Select * From Table Where ")
'variables to hold the and or values between fields
Dim andor1v As String = AndOr1.SelectedValue.ToString()
Dim andor2v As String = AndOr2.SelectedValue.ToString()
Dim andor3v As String = AndOr3.SelectedValue.ToString()
Dim andor4v As String = AndOr4.SelectedValue.ToString()
Dim andor5v As String = AndOr5.SelectedValue.ToString()
Dim andor6v As String = AndOr6.SelectedValue.ToString()
'variables to stop web control inputs going direct to sql
Dim name As String = NameSearch.Text.ToString()
Dim email As String = EmailSearch.Text.ToString()
Dim city As String = CitySearchBox.Text.ToString()
Dim province As String = ProvinceSelect.SelectedValue.ToString()
Dim qualifications As String = QualificationsObtained.Text.ToString()
Dim competencies As String = CompetenciesDD.SelectedValue.ToString()
Dim expertise As String = Expertiselist.SelectedValue.ToString()
If NameSearch.Text IsNot String.Empty Then
sql += "Surname LIKE '%" & name & "%' "
End If
If EmailSearch.Text IsNot String.Empty Then
sql += andor1v & " Email LIKE '%" & email & "%' "
End If
If CitySearchBox.Text IsNot String.Empty Then
sql += andor2v & " City LIKE '%" & city & "%' "
End If
If QualificationsObtained.Text IsNot String.Empty Then
sql += andor3v & " (institutionquals1 LIKE '%" & qualifications & "%') OR " & _
"(institutionquals2 LIKE '%" & qualifications & "%') OR " & _
"(institutionquals3 LIKE '%" & qualifications & "%') OR " & _
"(institutionquals4 LIKE '%" & qualifications & "%') "
End If
Dim selectedrow As String = CompetenciesDD.SelectedValue.ToString
Dim selectedquals As String = NQFlevel.SelectedValue.ToString
If CompetenciesDD.SelectedValue.ToString IsNot "0" And selectedquals = 0 Then
sql += (selectedrow & " = 1 ")
ElseIf selectedrow = "assessortrue" And selectedquals IsNot "0" Then
sql += andor4v & (" assessortrue=1 and assessorlvl=" & selectedquals)
ElseIf selectedrow = "coordinatortrue" And selectedquals IsNot "0" Then
sql += andor4v & ("coordinatortrue=1 and coordinatorlvl=" & selectedquals)
ElseIf selectedrow = "facilitatortrue" And selectedquals IsNot "0" Then
sql += andor4v & ("facilitatortrue=1 and facilitatorlvl=" & selectedquals)
ElseIf selectedrow = "moderatortrue" And selectedquals IsNot "0" Then
sql += andor4v & ("moderatortrue=1 and moderatorlvl=" & selectedquals)
ElseIf selectedrow = "productdevelopertrue" And selectedquals IsNot "0" Then
sql += andor4v & ("productdevelopertrue=1 and productdeveloperlvl=" & selectedquals)
ElseIf selectedrow = "projectmanagertrue" And selectedquals IsNot "0" Then
sql += andor4v & ("projectmanagertrue=1 and projectmanagerlvl=" & selectedquals)
End If
Response.Write(sql)
End Sub
经过一个小时的修改,代码现在看起来和上面一样^
现在我面临的问题是,如果用户没有输入姓氏(第一个字段)的值,但输入了电子邮件(或任何后续字段)的值,则生成的 sql 有一个额外的,就像这样;
Select * From Table Where And Email LIKE '%test%'
我也在寻找一种方法来考虑 OR 选项。你认为这应该像马丁所说的那样完成吗?整个查询是一个和或一个或而不是 2 的混合?那么我应该能够取出所有的和/或下拉菜单?
谢谢。
注意:我并不是真的在寻找关于我应该如何参数化或关于 sql 注入的 cmets。
【问题讨论】:
-
无论您多么信任您的用户,您肯定希望将 ' 替换为 '',就好像他们搜索 O'Reilly 一样,它会崩溃。另请参阅 SQL 注入。
-
您有什么问题?这看起来像“质量”动态 sql,但它似乎缺少一些逻辑,你能发布更多代码吗?
-
@andrewWin 。已发布完整代码和有关问题的更多信息,谢谢。
-
关于用户未选择选项的问题,为什么不删除“请选择”并将其默认为“和”?
标签: asp.net database vb.net search