проблема с несколькими поисковыми ключевыми словами - PullRequest
0 голосов
/ 26 апреля 2011

У меня есть веб-приложение, в котором пользователь может выполнять поиск, используя одно ключевое слово или несколько ключевых слов.Я использовал каждую технику, но я не знаю, что не так с этим кодом, поскольку он не фильтрует результат и продолжает добавлять новый результат.ключевые слова для поиска разделяются запятой, например summer, 38, blue это 3 ключевых слова.код и структура таблицы приведены ниже.

publi override list<result> retrunsearch(string search)
{
string[] search = pQuery.Split(',');
List <result> myresult = new List<result>();
for (int i = 1; i < search.Length; i++)
                {

  where += " And '%" + search[i] + "%'";
  OleDbCommand sqlcmdCommand0 = new OleDbCommand("select Distinct name from table1 where     search like '%" + search[0] + "%' " + where + " order by name", sqlcon);
                sqlcmdCommand0.CommandType = CommandType.Text;
                OleDbDataReader sdaResult0 = sqlcmdCommand0.ExecuteReader();
                while (sdaResult0.Read())
                {
                    result restult1= new result();
                    result1.name   = sdaResult0.String(0);
                    myresult.add(result1);
                }

                sdaResult0.Close();

}
return myresult;
}

public class result{

public result()
{
}

public string name{get;set;}
}

the structure of the table is: 
id      name           keyword;
1       blue  jeans      blue;
2       blue  jeans      38;
3       blue jeans       summer;
4       black jeans      black;
5       black jeans      38;
6       black jeans      summer; 

Ответы [ 3 ]

1 голос
/ 26 апреля 2011

Вы выполняете новую инструкцию SELECT для каждого элемента в списке ключевых слов.Вместо этого попробуйте создать предложение where и , а затем , выполнив оператор select:

public override list<result> retrunsearch(string search)
{
  string[] search = pQuery.Split(',');
  List <result> myresult = new List<result>();

  // Build WHERE
  for (int i = 1; i < search.Length; i++)
    where += " And '%" + search[i] + "%'";

  // Now search
  OleDbCommand sqlcmdCommand0 = new OleDbCommand("select Distinct name from table1 where     search like '%" + search[0] + "%' " + where + " order by name", sqlcon);
  sqlcmdCommand0.CommandType = CommandType.Text;
  OleDbDataReader sdaResult0 = sqlcmdCommand0.ExecuteReader();
  while (sdaResult0.Read())
  {
    result restult1= new result();
    result1.name   = sdaResult0.String(0);
    result.add(result1);
  }
  sdaResult0.Close();

  return result;
}

Несколько быстрых заметок:

  • Я ленив, поэтомуЯ сохранил ошибки в вашем коде, например, не объявлял переменную where.
  • Возможно, вам придется использовать «OR» вместо «AND» в предложении WHERE, в зависимости от того, как вы хотите, чтобы ваш поиск работал.
  • Используемый вами подход подвержен атаке SQL-инъекцией.
1 голос
/ 26 апреля 2011

Вам нужно немного изменить свой метод. Только цикл добавления должен быть в цикле for:

public override list<result> retrunsearch(string search)
{
    string[] search = pQuery.Split(',');
    List <result> myresult = new List<result>();

    OleDbCommand cmd = new OleDbCommand("select Distinct name from table1 where search like '%" + search[0] + "%', sqlcon);
    cmd.CommandType = CommandType.Text;
    for (int i = 1; i < search.Length; i++)
    {
        cmd.CommandText += " AND search like '%" + search[i] + "%'";
    }
    cmd.CommandText += " order by name";

    OleDbDataReader sdaResult0 = cmd.ExecuteReader();
    while (sdaResult0.Read())
    {
        result restult1= new result();
        result1.name   = sdaResult0.String(0);
        myresult.add(result1);
    }

    sdaResult0.Close();
    return myresult;
}
1 голос
/ 26 апреля 2011

Второй этап поиска записей с использованием одного или нескольких ключевых слов.Я добавил несколько более приятных имен и форматирования переменных, а также несколько советов по синтаксису, чтобы помочь с удобочитаемостью.

public override List<string> Search(string pQuery)
{
    string[] keywords = pQuery.Split(',');
    List<string> results = new List<string>();

    if (keywords.Length == 0)
    {
        // Code expects at least one keyword - throw exception or return null ?
    }

    StringBuilder query = new StringBuilder();
    query.Append(
        string.Format("SELECT DISTINCT name FROM table WHERE keyword LIKE '%{0}%'", keywords[0])
    );

    // Add extra keywords
    if (keywords.Length > 1)
    {
        for (int i = 1; i < keywords.Length; i++)
        {
            query.Append(string.Format(" OR keyword LIKE '%{0}%'", keywords[i]));
        }
    }

    // Add order by
    query.Append(" ORDER BY name");

    using (OleDbCommand command = new OleDbCommand(query.ToString(), sqlcon))
    {
        command.CommandType = CommandType.Text;

        using (OleDbDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                results.Add(reader.GetString(0));
            }
        }
    }

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