多个搜索关键字的问题

时间:2011-04-26 12:14:00

标签: c# ms-access

我有网络应用程序,在应用程序中,用户可以使用单个关键字或多个关键字进行搜索。我已经使用了所有技术,但我不知道这个代码有什么问题,因为它不会过滤结果并继续添加新结果。 搜索关键字用逗号分隔,如夏天,38,蓝色这些是3个关键字。表的代码和结构如下所示。

publi override list<result> retrunsearch(string search)
{
string[] search = pQuery.Split(',');
List <result> myresult = new List<result>();
for (int i = 1; i < search.Length; i++)
                {

  where += " And '%" + search[i] + "%'";
  OleDbCommand sqlcmdCommand0 = new OleDbCommand("select Distinct name from table1 where     search like '%" + search[0] + "%' " + where + " order by name", sqlcon);
                sqlcmdCommand0.CommandType = CommandType.Text;
                OleDbDataReader sdaResult0 = sqlcmdCommand0.ExecuteReader();
                while (sdaResult0.Read())
                {
                    result restult1= new result();
                    result1.name   = sdaResult0.String(0);
                    myresult.add(result1);
                }

                sdaResult0.Close();

}
return myresult;
}

public class result{

public result()
{
}

public string name{get;set;}
}

the structure of the table is: 
id      name           keyword;
1       blue  jeans      blue;
2       blue  jeans      38;
3       blue jeans       summer;
4       black jeans      black;
5       black jeans      38;
6       black jeans      summer; 

3 个答案:

答案 0 :(得分:1)

其次是使用一个或多个关键字检索记录。我添加了一些更好的变量名称和格式以及一些语法提示,以帮助提高可读性。

public override List<string> Search(string pQuery)
{
    string[] keywords = pQuery.Split(',');
    List<string> results = new List<string>();

    if (keywords.Length == 0)
    {
        // Code expects at least one keyword - throw exception or return null ?
    }

    StringBuilder query = new StringBuilder();
    query.Append(
        string.Format("SELECT DISTINCT name FROM table WHERE keyword LIKE '%{0}%'", keywords[0])
    );

    // Add extra keywords
    if (keywords.Length > 1)
    {
        for (int i = 1; i < keywords.Length; i++)
        {
            query.Append(string.Format(" OR keyword LIKE '%{0}%'", keywords[i]));
        }
    }

    // Add order by
    query.Append(" ORDER BY name");

    using (OleDbCommand command = new OleDbCommand(query.ToString(), sqlcon))
    {
        command.CommandType = CommandType.Text;

        using (OleDbDataReader reader = command.ExecuteReader())
        {
            while (reader.Read())
            {
                results.Add(reader.GetString(0));
            }
        }
    }

    return results;
}

答案 1 :(得分:1)

您正在为关键字列表中的每个项目执行新的SELECT语句。相反,尝试构建where子句,然后然后执行select语句:

public override list<result> retrunsearch(string search)
{
  string[] search = pQuery.Split(',');
  List <result> myresult = new List<result>();

  // Build WHERE
  for (int i = 1; i < search.Length; i++)
    where += " And '%" + search[i] + "%'";

  // Now search
  OleDbCommand sqlcmdCommand0 = new OleDbCommand("select Distinct name from table1 where     search like '%" + search[0] + "%' " + where + " order by name", sqlcon);
  sqlcmdCommand0.CommandType = CommandType.Text;
  OleDbDataReader sdaResult0 = sqlcmdCommand0.ExecuteReader();
  while (sdaResult0.Read())
  {
    result restult1= new result();
    result1.name   = sdaResult0.String(0);
    result.add(result1);
  }
  sdaResult0.Close();

  return result;
}

一些快速说明:

  • 我很懒,所以我在代码中保留了错误,例如没有声明“where”变量。
  • 您可能需要在WHERE子句中使用“OR”而不是“AND”,具体取决于您希望搜索的工作方式。
  • 您正在采取的方法受到SQL注入攻击。

答案 2 :(得分:1)

你需要稍微重构一下你的方法。只有查询追加应该在for循环中:

public override list<result> retrunsearch(string search)
{
    string[] search = pQuery.Split(',');
    List <result> myresult = new List<result>();

    OleDbCommand cmd = new OleDbCommand("select Distinct name from table1 where search like '%" + search[0] + "%', sqlcon);
    cmd.CommandType = CommandType.Text;
    for (int i = 1; i < search.Length; i++)
    {
        cmd.CommandText += " AND search like '%" + search[i] + "%'";
    }
    cmd.CommandText += " order by name";

    OleDbDataReader sdaResult0 = cmd.ExecuteReader();
    while (sdaResult0.Read())
    {
        result restult1= new result();
        result1.name   = sdaResult0.String(0);
        myresult.add(result1);
    }

    sdaResult0.Close();
    return myresult;
}