C# 使用绑定的复选框列表进行sql搜索查询

C# 使用绑定的复选框列表进行sql搜索查询,c#,asp.net,sql,checkboxlist,C#,Asp.net,Sql,Checkboxlist,我的asp网页上有一个复选框列表,其中列出了项目所需的一些技能。我想做的是从这个复选框列表中检查多个项目,然后创建一个搜索功能,列出所有具有相关技能的用户。我可以让它工作,但它不显示所有用户,而是只显示一个用户 例如,如果我从我的复选框列表中选择“规划”和“设计”,它应该列出用户“Peter”和“Vicki”,因为他们具有所需的技能,但我的代码只显示Peter。我的代码如下: StringBuilder sb2 = new StringBuilder(); foreach (ListItem

我的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;
                        }
                    }
            }
        }

它会针对每个选定的项目访问数据库,但如果我的假设是正确的,即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;
        }
    }

它会针对每个选定的项目访问数据库,但如果我的假设是正确的,即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;
        }
    }


在循环中,在项目之间循环,只需添加变量并将该值赋给变量即可。然后在where子句中使用该变量。在开始启动sql连接之前,还要结束该foreach循环。希望您能明白。

在您循环项目的循环中,只需添加变量并将该值指定给变量即可。然后在where子句中使用该变量。在开始启动sql连接之前,还要结束该foreach循环。希望您能明白。

您能尝试将%sign添加到您的同类查询中,看看它是否有效吗?您能尝试将%sign添加到您的同类查询中,看看它是否有效吗?谢谢您的回复,我是编程新手,对于while子句循环,我是否可以参考任何代码示例,以及如何调用数据库一次而不是每次查询?@spacebison我们不能只使用in子句并向变量添加项吗?为什么我们需要构建where子句?@AshReva是的,这是一种替代方案,可能代码更少。更新了答案,因为这是一个更容易/更简单的解决方案。非常感谢示例代码,我现在可以使用它了。谢谢你优秀-好东西-@AshReva也值得感谢(和投票),因为我用他更简单、更有效的解决方案修改了我的建议。很高兴它有帮助:)谢谢你的回答,我是一个编程新手,有没有任何代码示例可供我参考while子句循环,以及如何调用数据库一次而不是每次查询?@spacebison我们不能只使用in子句并将项添加到变量中吗?为什么我们需要构建where子句?@AshReva是的,这是一种替代方案,可能代码更少。更新了答案,因为这是一个更容易/更简单的解决方案。非常感谢示例代码,我现在可以使用它了。谢谢你优秀-好东西-@AshReva也值得感谢(和投票),因为我用他更简单、更有效的解决方案修改了我的建议。很高兴它有帮助:)嗨,AshReva,我对你的意思有点困惑?我认为在where子句中你使用了类似item.text的内容,但你应该在中使用s1.skilltitle,只在“in”子句中使用该变量。你明白了吗?嗨,AshReva,我有点困惑你能提供示例代码吗?嗨,AshReva,我对你的意思有点困惑?我认为在where子句中你使用的是item.text,但你应该在中使用s1.skilltitle,在“in”子句中使用该变量。你明白了吗?嗨,AshReva,我有点困惑你能提供示例代码吗?