1

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

例如,如果我从复选框列表中选中“计划”和“设计”,它应该列出用户“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;
                        }
                    }
            }
        }
4

2 回答 2

1

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

于 2013-02-16T13:43:48.467 回答
0

它会针对每个选定的项目访问数据库,但如果我的假设是正确的,即 Peter 拥有一项技能而 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;
        }
    }
于 2013-02-16T13:35:51.900 回答