2012-04-05 2 views
2

Я строю очень простую поисковую систему для сайта работы. Он имеет 3 необязательных поля ввода, термин, категорию и работодателя. Термины и поля работодателя - это текстовый ввод, а категория - раскрывающийся список. Логика поиска очень глупа, сложна и не масштабируема, но этот поиск предназначен для использования всего один раз, и все, что мне нужно от него, это то, что оно работает в нескольких случаях, и поскольку у меня есть более важные вещи, которые нужно делать в то время, когда я сделал Я попытался сделать это лучше.Запрос возвращается 0 строк

Это метод, который возвращает DataSet с результатами поиска.

private DataSet GetResults(string term, string category, string employer) 
{ 
     string query = "SELECT * FROM Jobs "; 

     MySqlConnection conn = DBConnection.Connect(); 
     MySqlCommand cmd = new MySqlCommand(); 
     cmd.Connection = conn; 
     cmd.CommandType = CommandType.Text; 

     if (String.IsNullOrEmpty(term) && String.IsNullOrEmpty(category) && String.IsNullOrEmpty(employer)) 
     { 
      cmd.CommandText = query; 
     } 
     else 
     { 
      query += "WHERE "; 
      if (!String.IsNullOrEmpty(term)) 
      { 
       query += "Title LIKE '%@term%' OR Job_Desc LIKE '%@term%' "; 

       if (!String.IsNullOrEmpty(category)) 
        query += "AND Category = @category "; 
       if (!String.IsNullOrEmpty(employer)) 
        query += "AND Title LIKE '%@employer%' AND Job_Desc LIKE '%@employer%' "; 
      } 
      else if (!String.IsNullOrEmpty(category)) 
      { 
       query += "Category = @category "; 

       if (!String.IsNullOrEmpty(term)) 
        query += "AND Title LIKE '%@term%' OR Job_Desc LIKE '%@term%' "; 
       if (!String.IsNullOrEmpty(poduzece)) 
        query += "AND Title LIKE '%@employer%' OR Job_Desc LIKE '%@employer%' "; 
      } 
      else if (!String.IsNullOrEmpty(employer)) 
      { 
       query += "Naziv LIKE '%@employer%' OR Job_Desc LIKE '%@poduzece%' "; 

       if (!String.IsNullOrEmpty(term)) 
        query += "AND Title LIKE '%@term%' OR Job_Desc LIKE '%@term%' "; 
       if (!String.IsNullOrEmpty(category)) 
        query += "AND Category = '@category' "; 
      } 
      cmd.CommandText = query; 
      cmd.Parameters.AddWithValue("@term", term.Trim()); 
      cmd.Parameters.AddWithValue("@category", category.Trim()); 
      cmd.Parameters.AddWithValue("@employer", employer.Trim()); 
     } 

     MySqlDataAdapter dataAdapter = new MySqlDataAdapter(cmd); 
     DataSet searchResult = new DataSet(); 
     dataAdapter.Fill(searchResult); 
     conn.Close(); 
     return searchResult; 
    } 

Проблема заключается в следующем. Когда я ищу только для термина или работодателя, я получаю 0 строк в обратном, но я получаю результаты для категории, которая выбрана из раскрывающегося списка и не запрашивается с условием LIKE, но с =. Сначала я предполагал, что у меня что-то не так с операторами LIKE и с OR и AND, но когда я вручную запрашиваю базу данных с тем же запросом, который встроен в код, я получаю результаты. Мое следующее предположение, что у меня что-то не так с параметрами, потому что, если я заменяю местозаполнители параметров фактическим пользовательским запросом, я получаю результаты.

Это работает. query + = "Title LIKE '% C programmer%' ИЛИ ​​Job_Desc LIKE '% C programmer%'";

Спасибо за помощь и извините за плохой английский. :)

+0

Вы ищете что-то вроде «Название LIKE»% »+ термин +% 'ИЛИ Job_Desc LIKE'%" + термин + "% '' ?? –

ответ

3

Установка значения параметров, используемых в LIKE оператора с%, а не в запросе

cmd.Parameters.AddWithValue("@term", "%" + term.Trim() + "%"); 
cmd.Parameters.AddWithValue("@category", category.Trim());    
cmd.Parameters.AddWithValue("@employer", "%" + employer.Trim() + "%"); 

конечно удалить% в тексте запроса. Также нет необходимости в одиночной кавычке перед каждым строковым параметром, как вы уже это делали для параметра @category

Однако этот код требует дальнейших уточнений. Если у вас нет значения термина или значения работодателя, сформированная строка sql не содержит заполнителя для соответствующего параметра. Однако в конце все параметры добавляются. Таким образом, команда выйдет из строя с неожиданным исключением параметра.

Смежные вопросы