【问题标题】:using a bound CheckBoxList for sql search query使用绑定的 CheckBoxList 进行 sql 搜索查询
【发布时间】:2013-02-16 13:28:24
【问题描述】:

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

【问题讨论】:

  • 您可以尝试将 % 符号添加到您的 like 查询中,看看它是否有效?

标签: c# asp.net sql checkboxlist


【解决方案1】:

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

【讨论】:

  • 嗨 AshReva,我对你的意思有点困惑?
  • 我认为在你的 where 子句中你使用 like item.text 但你应该使用 s1.skilltitle in 并且只在“IN”子句中使用该变量。你明白了吗?
  • 嗨 AshReva,我有点困惑,你能提供示例代码吗?
【解决方案2】:

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

【讨论】:

  • 感谢您的回复,我是编程新手,是否有任何代码示例可供我参考 while 子句循环以及如何调用一次数据库而不是每次都查询?跨度>
  • @spacebison 我们不能只使用 in 子句并将项目添加到变量中吗?为什么我们需要构建 where 子句?
  • @AshReva 是的,这是一种替代方法,可能代码更少。更新了答案,因为它是一个更容易/更简单的解决方案。
  • 非常感谢示例代码,我现在可以正常工作了。谢谢
  • 优秀 - 好东西 - @AshReva 也值得感谢(和投票),因为我用他更简单、更有效的解决方案调整了我的建议。很高兴它有帮助:)
猜你喜欢
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
  • 2020-04-28
  • 2015-06-30
相关资源
最近更新 更多