Как я могу использовать отдельные слова из пользовательского ввода в запросе SQL «ГДЕ КОНТАНС» в C#? - PullRequest
0 голосов
/ 19 апреля 2020

Это мой первый заданный вопрос, и я не могу найти ответ, поэтому извиняюсь, если я его где-то пропустил.

В настоящее время я создаю функцию поиска в HR Portal, который я разрабатываю (ASP. NET MVC), и, хотя мне удалось настроить его для запроса к созданной мной SQL базе данных сервера, в настоящее время он работает используя запрос LIKE, например:

public List<Detail> Search(List<string> Information)
{
    StringBuilder Buildsql = new StringBuilder();
    Buildsql.Append("select * from UH_QA.dbo.Answers where ");

    foreach (string value in Information)
    {
        Buildsql.AppendFormat("(Question like '%{0}%') and ", value);
    }

    string datasql = Buildsql.ToString(0, Buildsql.Length - 5);

    return QueryList(datasql);
}

Но чтобы убедиться, что функция поиска защищена от дурака, я хочу использовать такой запрос:

SELECT * 
FROM UH_QA.dbo.Answers 
WHERE CONTAINS(Question, '"Where" OR "do" OR "I" OR "put" OR "my" OR "phone"')

Любой совет о том, как я мог бы go об изменении того, что у меня уже есть, чтобы разделить введенную пользователем строку и затем вставить отдельные слова в запрос?

Мои мысли, где использовать value.Split(' '), чтобы разбить строку по пробелам, но я открыт для предложений.

1 Ответ

0 голосов
/ 19 апреля 2020

Вы бы достигли этого путем:

  1. Изменение подписи QueryList, чтобы можно было изменять число параметров.

  2. Изменение Ваш блок foreach заполняет список параметров и создает SQL. Обратите внимание, что это избавит от уязвимостей SQL.

  3. В вашем методе QueryList добавьте параметры в команду.

public List<Detail> Search(List<string> Information)
{
    StringBuilder Buildsql = new StringBuilder();
    Buildsql.Append("select * from UH_QA.dbo.Answers where ");

    List<SqlParameter> queryParameters = new List<SqlParameter>();

    for (int i = 0; i < Information.Count; i++)
    {
        if (!string.IsNullOrEmpty(Information[i])) 
        {
            queryParameters.Add(new SqlParameter("@p" + i.ToString(), SqlDbType.VarChar) {
                Value = Information[i]
            });

            if (i > 0) 
            {
                Buildsql.Append(" OR ");
            }

            Buildsql.AppendFormat("Question like '%' + @p{0} + '%'", i);
        }
    }

    return QueryList(datasql, queryParameters);
}

public List<Detail> QueryList(string query, IEnumerable<SqlParameter> parameters) {
    // Do use the `parameters` when accessing the database
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...