使用绑定的CheckBoxList进行sql搜索查询

时间:2013-02-16 13:28:24

标签: c# asp.net sql checkboxlist

我的asp网页上有一个复选框列表,其中列出了项目所需的一些技能。我想要做的是检查此复选框列表中的多个项目,然后创建一个搜索功能,列出所有具有相关技能的用户。我可以让这个工作,但不是显示所有用户,它只显示一个用户。

例如,如果我从我的复选框列表中选中“Planning”和“Designing”,它应该列出用户“Peter”和“Vicki”,因为他们具备所需的技能但我的代码只显示了Peter。我的代码如下:

StringBuilder sb2 = new StringBuilder();

foreach (ListItem item in chkGeneralSkills.Items)
        {
            if (item.Selected)
            {
                sb2.AppendFormat("{0}  ", item.Text);


                    using (SqlConnection oConn = new SqlConnection(ConfigurationManager.ConnectionStrings["connString"].ToString()))
                    {
                        string sql = "SELECT us.FName + ' ' + us.SName As 'Name', " +
                                 "sk.SkillsID, sl.SkillTitle " +
                                 "FROM Users us " +
                                 "LEFT JOIN Skills sk ON sk.UserID = us.UserID " +
                                 "LEFT JOIN SkillsListing sl ON sl.SkillsListingID = sk.SkillsListingID " +
                                 "WHERE sl.SkillTitle LIKE '" + item.Text + "'";
                        try
                        {
                            oConn.Open();
                            SqlCommand cmd = new SqlCommand(sql, oConn);
                            SqlDataReader reader = cmd.ExecuteReader();
                            chkMatchedUsers.DataTextField = "Name";
                            chkMatchedUsers.DataValueField = "Name";
                            chkMatchedUsers.DataSource = reader;

                            chkMatchedUsers.DataBind();

                            oConn.Close();
                        }
                        catch (Exception)
                        {
                            throw;
                        }
                    }
            }
        }

2 个答案:

答案 0 :(得分:1)

在循环浏览项目的循环中,只需添加变量并将该值赋给变量。然后在where子句中使用该变量。在开始启动sql连接之前,还要结束foreach循环。希望你清楚。

答案 1 :(得分:0)

它为每个选定的项目击中了数据库,但如果我的假设是正确的,彼得有一个技能而Vicky有另一个,那么你忽略了第一个响应并覆盖了第二个。

使用你已经拥有的东西,你应该建立一个循环遍历项目的where子句,然后只调用一次数据库,而不是每个选定的项目。这将导致您的数据库往返减少,并且应该在结果中返回Vicky和Peter,而不是一个或另一个。

未经测试的代码 - 为您提供想法如何完成。

var sb = new StringBuilder();
    foreach (ListItem item in chkGeneralSkills.Items)
    {
        if (item.selected)
        {       
           sb.Append("'" + item.text + "',");
        }
    }

    using (SqlConnection oConn = new SqlConnection(ConfigurationManager.ConnectionStrings["connString"].ToString()))
    {
        string sql = "SELECT us.FName + ' ' + us.SName As 'Name', " +
                    "sk.SkillsID, sl.SkillTitle " +
                    "FROM Users us " +
                    "LEFT JOIN Skills sk ON sk.UserID = us.UserID " +
                    "LEFT JOIN SkillsListing sl ON sl.SkillsListingID = sk.SkillsListingID " + 
                    " WHERE sl.SkillTitle IN (" + sb.ToString() + ")";
        try
        {
            oConn.Open();
            SqlCommand cmd = new SqlCommand(sql, oConn);
            SqlDataReader reader = cmd.ExecuteReader();
            chkMatchedUsers.DataTextField = "Name";
            chkMatchedUsers.DataValueField = "Name";
            chkMatchedUsers.DataSource = reader;

            chkMatchedUsers.DataBind();

            oConn.Close();
        }
        catch (Exception)
        {
            throw;
        }
    }