0

这是我的问题的背景:我有一个组合框,当用户开始输入时,它应该从数据库表的列中检索建议的项目。用户开始输入姓名,程序应通过查看名字和姓氏来建议姓名(数据库对两者都有单独的表)

这是我的代码:

        try{
            String temp = nameCBox.Text;
            AutoCompleteStringCollection namesSuggestion = new AutoCompleteStringCollection();
            OleDbConnection conn = new OleDbConnection("Provider=Microsoft.ACE.Oledb.12.0;Data Source=C:\\LogEntry\\LogEntry.accdb; Persist Security Info = False;");
            OleDbDataReader reader;
            conn.Open();
            String text2send = "Select Name from [Teachers] where FName like '" + temp + "' OR LName like '" + temp + "' Group by [Name]";
            OleDbCommand cmd = new OleDbCommand(text2send, conn);
            reader = cmd.ExecuteReader();
            if (reader.HasRows == true)
            {
                while (reader.Read())
                    namesSuggestion.Add(reader["temp"].ToString());
            }
            reader.Close();
            nameCBox.AutoCompleteCustomSource = namesSuggestion;

            conn.Close();
            }

错误:1)我在组合框中没有看到任何建议 2)当我在组合框中输入时,它会突出显示文本,当我再次输入其他内容时,它会写在之前输入的字符上。

请帮助桌面制造商

4

2 回答 2

0

厄姆

这是在做什么

namesSuggestion.Add(reader["temp"].ToString()); 

reader 正在返回一个名为 Name..

除非用户键入它,否则我会期望搜索字符串包含通配符。

例如Like 'John%',或者Like '%Smith'在标准 sql 中,访问使用 * 而不是 % 我似乎记得。

哦,大概你不担心 sql 注入攻击?

于 2012-08-29T10:45:54.140 回答
0

由于您使用的是 Like 运算符,请尝试使之间的输入看起来像这样:%input% 要获得类似:

看看这个,它可能会有所帮助

var sql = String.Format("Select Name from [Teachers] WHERE FName Like '%{0}%' OR LName Like '%{0}%'", temp);

其他几点可能对您当前的代码有帮助:

  • 在您的代码中使用该using语句,它会处理资源,对于连接,它会关闭它。

    using(var conn = new OleDbConnection("ConnectionStrong"))
    {
        //code
    }
    
  • 最好的,是使用参数化查询链接

于 2012-08-29T10:33:30.957 回答