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

本文关键字:sql 搜索 查询 进行 CheckBoxList 绑定 | 更新日期: 2023-09-27 17:59:53

我的asp网页上有一个复选框列表,列出了一个项目所需的一些技能。我想做的是从这个复选框列表中选中多个项目,然后创建一个搜索功能来列出所有与选中的用户具有相关技能的用户。我可以让它发挥作用,但它没有显示所有用户,而是只显示一个用户。

例如,如果我在复选框列表中选中"规划"answers"设计",它应该列出用户"Peter"answers"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;
                        }
                    }
            }
        }

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

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

它会为每个选定的项目进入数据库,但如果我的假设是正确的,即Peter拥有其中一个to技能,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;
        }
    }