Пример расширенного поиска в базе данных - PullRequest
1 голос
/ 24 марта 2010

я ищу пример сценария. Я видел один вчера, но для жизни я не могу найти его снова сегодня.

Задача, которую я имею, состоит в том, чтобы позволить пользователю искать 1 таблицу базы данных с помощью элементов управления вводом на странице aspx, где они могут выбирать и, или, равны, комбинировать поля, генерируя sql на лету с помощью concat / stringbuilder или аналогичного. (он работает за межсетевым экраном корпорации)

Пожалуйста, кто-нибудь может указать мне правильное направление примера или учебника

Я работал над страницей, но столкнулся с проблемами. Вот это 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%' 

Я также ищу способ принять во внимание опцию ИЛИ. Как вы думаете, это должно быть сделано, как говорит Мартин, когда весь запрос представляет собой либо и, или или, а не сочетание двух? Тогда я смогу убрать все и / или выпадающие списки?

Спасибо.

NB. Мне не нужны комментарии о том, как мне следует параметризоваться, или о внедрении SQL.

Ответы [ 5 ]

1 голос
/ 24 марта 2010

Чтобы избежать внедрения sql и разрешить динамический поиск, я бы, вероятно, написал бы хранимую процедуру примерно так. Если ничего не выбрано, отправьте DBNull.Value в коллекцию параметров ado.net в качестве значения параметра. При таком подходе вы можете проверить любые столбцы, которые вы хотите, и если они не выбраны пользователем, они будут игнорироваться.

РЕДАКТИРОВАТЬ: я только что увидел, что вам не разрешено использовать хранимые процедуры. Я изменил свой ответ ниже, чтобы показать параметризованный оператор SQL

SELECT * FROM TABLE
WHERE ([name] = @name OR @name IS NULL)
AND (email = @email OR @email IS NULL)
AND (city = @city OR @city IS NULL)
AND (province = @province OR @province IS NULL)
AND (qualifications = @qualifications OR @qualifications IS NULL)
AND (competencies = @competencies OR @competencies IS NULL)
AND (expertise = @expertise OR @expertise IS NULL)
1 голос
/ 24 марта 2010

Относительно вашей проблемы с пользователями, не выбирающими опцию, вы можете просто удалить «пожалуйста, выберите» и установите для него значение по умолчанию «и»

Также, каково желаемое поведение, если они выбирают сочетание AND и OR?

По умолчанию значения AND будут оцениваться первыми при отсутствии каких-либо скобок

http://msdn.microsoft.com/en-us/library/ms186992.aspx

Так что, если они введут

name = "Fred" или email = "blah" и city ​​= "london" и провинция = "xyz" или квалификация = "Степень"

Я не совсем уверен, какой будет желаемая семантика?

Это

(name = "Fred" или email = "blah") и city ​​= "london" и (провинция = "xyz" или квалификация = "Степень")

или

(name = "Fred" или (email = "blah" и city ​​= "london") и провинция = "xyz") или квалификация = "Степень"

Или что-то другое? Возможно, вам следует ограничить их AND или OR для всего запроса или разрешить их устранение неоднозначности, введя синтаксис расширенного поиска в квадратных скобках или предоставив пользовательский интерфейс построителя запросов.

0 голосов
/ 24 марта 2010

Я сделал этот интерфейс запросов «динамического» типа на классическом ASP.

Совет, который я даю вам, заключается в том, что вы пытаетесь выполнить весь запрос за одну загрузку страницы, чтобы ...

Обратите внимание на «построение» запроса с помощью интерфейса типа «мастер» - либо ajax для новизны, либо просто несколько страниц для каждой части построения запроса.

Это сущность дает вам «постоянство» с помощью того, что у вас есть (сеанс, хранилище данных, cookie и т. Д.) Для каждой части запроса, и вы можете проверять правильность каждой части запроса при сборке.

0 голосов
/ 24 марта 2010
 Dim sql As String = ("Select * From Table Where **1=1**")

    '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 And andor1v IsNot "0" Then
        sql += "**and** Surname LIKE '%" & name & "%' " 
    ElseIf NameSearch.Text IsNot String.Empty And andor1v Is "0" Then
        sql += "**or** Surname LIKE '%" & name & "%' "
    End If

  ....additional logic here.....
    Response.Write(sql)

End Sub

обратите внимание на ** части. 1 = 1 оценивается как true на большинстве СУБД. Это позволяет вам просто начать конкатенацию ваших или / и к ним, не беспокоясь о ()

0 голосов
/ 24 марта 2010

Конкретные строки для построения запроса никогда не были хорошей идеей. Вы должны использовать хранимую процедуру или параметризованные запросы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...