2

求人サイト用の非常に単純な検索エンジンを構築しています。用語、カテゴリ、雇用主の 3 つのオプション入力フィールドがあります。期間と雇用者フィールドはテキスト入力で、カテゴリはドロップダウン リストです。検索ロジックは非常に愚かで複雑で、スケーラブルではありませんが、この検索は 1 回だけ使用することを意図しており、必要なのはいくつかのケースで機能することだけです。 t はそれを改善しようとしました。

これは、検索結果を含む 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 プログラマー%' ";

助けてくれてありがとう。下手な英語でごめんなさい。:)

4

1 に答える 1

3

LIKE演算子で使用されるパラメーター値を、クエリではなく%で設定します

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

もちろん、クエリテキストの%を削除してください。また、@ categoryパラメータの場合のように、すべての文字列パラメータの前に一重引用符を付ける必要はありません。

ただし、このコードにはさらに改良が必要です。用語値または雇用者値がない場合、形成されたSQL文字列には、それぞれのパラメーターのプレースホルダーが含まれていません。ただし、最後に、すべてのパラメーターが追加されます。したがって、コマンドは予期しないパラメータ例外で失敗します。

于 2012-04-05T13:44:07.943 に答える