像Google一样进行文本框搜索

问题描述

| 我正在使用C#.net Windows窗体,并且我需要创建一个搜索文本框,该文本框将显示组合框值(类似于google搜索);组合框中显示的值将是sql 2005数据库中的值(例如,用户正在搜索FirstName,该组合框将显示所有名字,这些名字将随着用户键入更多字母而被过滤。...如果用户正在搜索姓氏,组合框显示数据库中的所有姓氏值。 当我做上述任务时 我已经写了这样的SQL查询
SELECT  distinct(person_Firstname+\'\'+person_Lastname) 
AS 
name FROM persondetails 
WHERE name Like \'%\'+@name+\'%\'
当我执行此查询时,它给出这样的错误---必须声明标量变量 我的目标是当我在文本框中输入第一个字母时,它将显示所有以该字母开头的名称,例如在google ... 谁能纠正这个....
private void tbautocomplete_TextChanged(object sender,EventArgs e)
{
    AutoCompleteStringCollection namecollection = new AutoCompleteStringCollection();
    sqlConnection con = new sqlConnection(@\"Data Source=88888;Initial Catalog=contrynames;Integrated Security=True\");
    sqlCommand cmd = new sqlCommand();
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = \"SELECT  distinct(person_Firstname+\'\'+person_Lastname) AS name FROM persondetails WHERE name Like \'%\'+@name+\'%\'\";
    con.open();
    sqlDataReader rea = cmd.ExecuteReader();
    if (rea.HasRows == true)
    {
        while (rea.Read())
        namecollection.Add(rea[\"name\"].ToString());            
    }
    rea.Close();

    tbautocomplete.AutoCompleteMode = AutoCompleteMode.Suggest;
    tbautocomplete.AutoCompleteSource = AutoCompleteSource.CustomSource;
    tbautocomplete.AutoCompleteCustomSource = namecollection;
    

解决方法

        听起来您正在尝试在应用中构建自动完成功能。您只缺少SqlCommand上的参数。尝试这个:
string searchFor = \"%\" + txtName.Text + \"%\"; //the string the user entered.

cmd.CommandText = @\"SELECT  distinct(person_Firstname+\'\'+person_Lastname) AS name
                    FROM persondetails 
                    WHERE person_Lastname Like @name
                    OR person_Firstname LIKE @name\";

cmd.Parameters.AddWithValue(\"@name\",searchFor);
您的“ 3”子句必须使用表中的列名。听起来好像您想将名字或姓氏列与您的搜索令牌匹配。
 WHERE person_Lastname LIKE @name
    OR person_Firstname LIKE @name
    ,        您正在寻找的功能称为自动完成。我不熟悉Windows窗体中的“自动完成”控件,但是如果没有内置控件,则肯定会有第三方控件执行此操作。 AutoComplete控件可能会提供事件回调,您可以在其中放置SQL查询以提供可能的补全。 至于您的SQL错误,看来这可能是列名的问题,但是如果没有您的模式,很难分辨出来。 编辑: 我看到您已经在使用自动完成控制。 SQL中的问题是查询中包含
@name
参数,但是您尚未将参数添加到
cmd
对象中,因此它不知道要在其中放置什么值。