求人サイト用の非常に単純な検索エンジンを構築しています。用語、カテゴリ、雇用主の 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 プログラマー%' ";
助けてくれてありがとう。下手な英語でごめんなさい。:)