文本框搜索就像谷歌一样

时间:2011-06-11 15:06:01

标签: c# sql-server

我正在使用C#.net Windows窗体,我需要创建一个搜索文本框,它将显示组合框值(类似于谷歌搜索);组合框中显示的值将是SQL 2005数据库中的值(用户在FirstName上搜索的示例,组合框将显示所有名字,当用户键入更多字母时,将对其进行过滤....如果用户正在搜索LastName,组合框显示数据库中的所有LastName值。等等)

当我做上述任务时

我已经编写了像这样的SQL查询

SELECT  distinct(person_Firstname+''+person_Lastname) 
AS 
name FROM persondetails 
WHERE name Like '%'+@name+'%'

当我执行此查询时,它会给出这样的错误---必须声明一个标量变量

我的目标是当我在文本框中输入第一个字母时,它会显示所有以该字母开头的名字,如谷歌......

任何人都可以纠正这个....

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;

2 个答案:

答案 0 :(得分:3)

听起来您正在尝试在应用中构建自动完成功能。您只缺少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);

您的WHERE子句必须使用表格中的列名称。听起来好像您想要将第一个或最后一个名称列与搜索令牌匹配。

 WHERE person_Lastname LIKE @name
    OR person_Firstname LIKE @name

答案 1 :(得分:0)

您正在寻找的功能称为自动完成功能。我不熟悉Windows窗体中的自动完成控件,但如果没有内置的控件,肯定会有第三方控件执行此操作。

AutoComplete控件可能会提供一个事件回调,您可以在其中放置SQL查询以提供可能的完成。

至于你的SQL错误,它看起来可能是列名称的问题,但没有你的架构很难分辨。

修改

我看到你已经使用了自动完成控制器。 SQL中的问题是您的@name参数在查询中,但您没有将参数添加到cmd对象,因此它不知道放在那里的值。