2012-04-05 146 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出了問題,但是當我使用代碼中構建的相同查詢手動查詢數據庫時,我得到了結果。 我的下一個猜測是,我得到了錯誤的參數,因爲如果我用實際用戶查詢替換參數佔位符,我會得到結果。

This Works。 query + =「標題LIKE'%C程序員%'或者Job_Desc LIKE'%C程序員%'」;

感謝您的幫助,並對不好的英語感到抱歉。 :)

+0

你看起來像「Title LIKE'%」+ term +%'或Job_Desc LIKE'%「+ term +」%「'? – 2012-04-05 13:45:14

回答

3

坐落在LIKE運算%和不使用查詢

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

當然在查詢文本刪除%的參數值。同樣,不需要每個字符串參數前面的單引號,因爲您已經對@category參數做了這樣的操作。但是,此代碼需要進一步改進。如果您沒有術語值或僱主值,則形成的sql字符串不包含相應參數的佔位符。然而,最後,所有參數都被添加。因此,該命令將失敗並出現意外的參數異常。