我正在为工作网站构建非常简单的搜索引擎。它有3个可选的输入字段,术语,类别和雇主。术语和雇主字段是文本输入,类别是下拉列表。 搜索逻辑非常愚蠢,复杂且不可扩展但是这个搜索只能使用一次,我需要的只是它适用于少数情况,因为我有更重要的事情要做的时候我没有'我试图让它变得更好。
这是返回带有搜索结果的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 :(得分:3)
使用%设置LIKE运算符中使用的参数值,而不是在查询
中cmd.Parameters.AddWithValue("@term", "%" + term.Trim() + "%");
cmd.Parameters.AddWithValue("@category", category.Trim());
cmd.Parameters.AddWithValue("@employer", "%" + employer.Trim() + "%");
当然会删除查询文本中的%。此外,您不必在每个字符串参数前面使用单引号,就像您已经为@category参数所做的那样
但是此代码需要进一步改进。如果您没有术语值或雇主值,则形成的sql字符串不包含相应参数的占位符。但是,最后,添加了所有参数。因此,该命令将因意外的参数异常而失败。