2012-04-05 8 views
2

私は仕事のサイトのための非常に簡単な検索エンジンを構築しています。それは、3つのオプションの入力フィールド、用語、カテゴリ、および雇用者を持っています。期間フィールドと雇用者フィールドはテキスト入力で、カテゴリはドロップダウンリストです。 検索ロジックは非常に愚かで、複雑でスケーラブルではありませんが、この検索は1回だけ使用することを前提としています。それはいくつかのケースで動作し、それをより良くしようとしました。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 + = "タイトル%LIKE '%Cプログラマー%' OR Job_Desc LIKE '%Cプログラマー%'";

英語を苦手にして申し訳ありません。もちろん:)

+0

あなたは「タイトルLIKE '%」+用語+%' OR 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文字列には、それぞれのパラメータのプレースホルダが含まれません。ただし、最後にすべてのパラメータが追加されます。したがって、予期しないパラメータの例外が発生してもコマンドは失敗します。

関連する問題