Добавление более 1 идентификатора для поиска в SQL - PullRequest
0 голосов
/ 03 января 2012

Привет всем, мне нужны некоторые идеи о том, как поступить следующим образом:

У меня есть текстовое поле, в котором пользователь может ввести идентификатор для поиска в базе данных.В настоящее время он просто проверяет 1 идентификатор.

Пример:

User types in ID 645378

Запрос будет выглядеть следующим образом:

SELECT * FROM blahTable WHERE theID = '645378';

Теперь я ищу, чтобы пользователь могвведите более 1 идентификатора за раз и отобразите эти результаты.

Итак, еще раз приведем пример:

User types in ID(s): 645378, 78664, 901524

И вот теперь мой вопрос вступает в игру.Как я могу создать запрос на основе того, сколько идентификаторов введено пользователем в текстовое поле?

Любая помощь будет отличной!

Дэвид

Ответы [ 4 ]

4 голосов
/ 03 января 2012

Вы можете использовать оператор IN в SQL.

SELECT * FROM blahTable where theID in ('123','456','789')

Я бы посоветовал реализовать это с помощью параметризованного запроса, чтобы избежать таблиц Бобби (SQL-инъекция)

2 голосов
/ 03 января 2012

Просто используйте IN:

SELECT * FROM blahTable WHERE theID IN (645378, 78664, 901524);

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

    Dim asValues As String()
    Dim sbQuery As New System.Text.StringBuilder(5000)

    ' Get the text, but remove any embedded semi-colons and single quotes for sql injection'
    asValues = Miles.Text.Replace(";", " ").Replace("'", " ").Split(New Char() {","c}, StringSplitOptions.RemoveEmptyEntries)

    sbQuery.Append("SELECT * FROM blahTable WHERE theID IN (")

    Dim fUseComma As Boolean

    ' Add each value to the query string. In this case, we are wrapping with '
    For Each sValue As String In asValues
        ' Test the value for reasonableness (example only)'
        If IsNumeric(sValue) Then
            ' Only use the comma starting from the second valid item added
            If fUseComma Then
                sbQuery.Append(",")
            Else
                fUseComma = True
            End If
            sbQuery.Append("'").Append(CInt(sValue)).Append("'")
        End If
    Next

    sbQuery.Append(")")

    cmd.CommandText = sbQuery.ToString
1 голос
/ 03 января 2012

попробуйте это.

    Dim xIDList As String = "645378, 78664, 901524" 'the user should separate ID by COMMA 
    Dim xID() As String = xIDList.Split(CChar(",")) 'splits the xIDlist
    Dim xIDforQuery As String = String.Empty
    For Each oID As String In xID
        If oID.Trim.Length <> 0 Then
            xIDforQuery &= "," & " '" & oID & "'"     ' if ID is not numeric
            ' xIDforQuery &= "," & oID.ToString      ' use this line if ID is numeric
        End If
    Next

    xIDforQuery = xIDforQuery.Trim
    xIDforQuery = CStr(IIf(Mid(xIDforQuery, 1, 1) = ",", Mid(xIDforQuery, 2, xIDforQuery.Length - 1), xIDforQuery))

    Dim xFinalQuery As String = String.Empty
    xFinalQuery = String.Format("SELECT * FROM blahTable where theID in ({0})", xIDforQuery)

    '  xFinalQuery is the final query statement but this approach is vulberable to SQL Injection.

Screenshot

0 голосов
/ 03 января 2012

Как пользователи узнают, какие идентификаторы им нужны?Если идентификаторов не слишком много, использование списка с множественным выбором улучшит интерфейс и упростит код.Если их слишком много, вы можете рассмотреть возможность использования текстового поля с автозаполнением, чтобы пользователи могли выбирать элементы, которые затем можно скопировать (удалить) из списка для использования в запросе.

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