我的asp网页上有一个复选框列表,其中列出了项目所需的一些技能。我想要做的是检查此复选框列表中的多个项目,然后创建一个搜索功能,列出所有具有相关技能的用户。我可以让这个工作,但不是显示所有用户,它只显示一个用户。
例如,如果我从我的复选框列表中选中“Planning”和“Designing”,它应该列出用户“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;
}
}
}
}
答案 0 :(得分:1)
在循环浏览项目的循环中,只需添加变量并将该值赋给变量。然后在where子句中使用该变量。在开始启动sql连接之前,还要结束foreach循环。希望你清楚。
答案 1 :(得分:0)
它为每个选定的项目击中了数据库,但如果我的假设是正确的,彼得有一个技能而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;
}
}