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