Good Afternoon All,
我正在创建一个管理页面,其中显示了一系列事件以及自愿提供帮助的人员。我有一张活动桌,另一张是志愿者。
我将eventID存储到志愿者的桌子中并且能够加入他们,但是当我加入他们时,我为每个志愿者获得了一个新行,该行再次显示了事件名称。
我想显示活动名称,并在活动名称下方显示志愿者。
离。
event A
Volunteer 1
volunteer 2
volunteer 3
event B
Volunteer 1
volunteer 2
有人能指出我正确的方向吗?
public string volunteers(){
SqlCommand cmd = new SqlCommand(@"SELECT* FROM fundraiser_youth
LEFT JOIN
fundrasier_helpers ON fundraiser_youth.id = fundrasier_helpers.eventID
ORDER BY reportTime;", con);
con.Open();
SqlDataReader reader;
reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
DateTime reportTime = Convert.ToDateTime(reader[1]);
DateTime gateTime = Convert.ToDateTime(reader[2]);
DateTime gameTime = Convert.ToDateTime(reader[3]);
VOLUNTEER.Append("<div class='col-md-4'>");
VOLUNTEER.Append("<div class='well well-lg'>");
VOLUNTEER.Append("<form action='register/default.aspx' method='POST'>");
VOLUNTEER.Append("<h4>" + reportTime.DayOfWeek + " " + reportTime.Month + "/" + reportTime.Day + "/" + reportTime.Year + "</h4>");
VOLUNTEER.Append("<h5>" + reader[4].ToString() + " " + reader[7].ToString() + " " + reportTime.ToString("h:mm tt", CultureInfo.InvariantCulture) + "</h5>");
VOLUNTEER.Append("<ul>");
VOLUNTEER.Append("<li>" + reader[10].ToString() + " " + reader[11].ToString() + "</li>");
VOLUNTEER.Append("</ul>");
VOLUNTEER.Append("<input type=hidden name='id' value='" + reader[8].ToString() + "' />");
VOLUNTEER.Append("<span style='text-align:right; margin-top:20px;'><input type='submit' value='Register' class='btn btn-info' /></span>");
VOLUNTEER.Append("</form>");
VOLUNTEER.Append("</div>");
VOLUNTEER.Append("</div>");
}
return VOLUNTEER.ToString();
}
return "no info provided";
}
答案 0 :(得分:1)
您说明的问题的第一个方面是选择列表。 Select *
将返回每个连接行的查询中所有已连接表的所有列。因此,您的每个助手都会将筹款活动信息作为其行数据的一部分。
维护的一面注意事项:select *
是“生产代码”的坏习惯,特别是如果你通过索引(你是)从结果集中获取字段,因为如果你添加一个字段到fundraiser_youth
,表示来自fundraiser_helpers
的字段的所有索引将不再与返回的结果集对齐,并且此字段数据上的UI和任何验证逻辑都将中断。我强烈建议您明确指定所需列的列表,使用列名而不是索引位置将它们从reader
中取出,或者两者兼而有之。
由于您是在C#中以编程方式消化结果,因此对您所述问题的最简单解决方案是首先更改ORDER BY
子句,以便在其他任何内容之前按fundraiser_youth.id
排序。然后,在第一行获取一次事件信息,生成事件标题和HTML中的第一个志愿者行,记住该事件ID,并在迭代通过读取器生成其余志愿者的时候根据后续行的ID进行检查HTML行。只要事件ID匹配,忽略事件字段并仅提取/显示辅助字段。当它们不同时,事件已更改,您需要重新检索下一个子标题的事件信息。
答案 1 :(得分:0)
以下是我最终解决问题的方法。可能不是最佳选择,但它可以工作,感谢大家的输入和生产代码我用列替换了select *。我创建了一个名为(loadHelpers)的新函数,并将当前Event的id传递给它。这个功能吸引了所有注册帮助的志愿者。
public string volunteers()
{
SqlCommand cmd = new SqlCommand(@"SELECT * FROM fundraiser_youth WHERE reportTime >='" + DateTime.Now + "' ORDER BY reportTime" , con);
con.Open();
SqlDataReader reader;
try
{
reader = cmd.ExecuteReader();
if (reader.HasRows)
{
while (reader.Read())
{
DateTime reportTime = Convert.ToDateTime(reader["reportTime"]);
DateTime gateTime = Convert.ToDateTime(reader["gateTime"]);
DateTime gameTime = Convert.ToDateTime(reader["gameTime"]);
events.Append("<div class='col-md-4'>");
events.Append("<div class='well well-lg'>");
events.Append("<form action='register/default.aspx' method='POST'>");
events.Append("<h4>" + reportTime.DayOfWeek + " " + reportTime.Month + "/" + reportTime.Day + "/" + reportTime.Year + "</h4>");
events.Append("<h5>" + reader["eventName"].ToString() + " " + reader["location"].ToString() + " " + reportTime.ToString("h:mm tt", CultureInfo.InvariantCulture) + "</h5>");
events.Append(loadHelpers(reader["id"].ToString()));
events.Append("<!--<span style='text-align:right; margin-top:20px;'><input type='submit' value='Edit' class='btn btn-info' /></span>-->");
events.Append("</form>");
events.Append("</div>");
events.Append("</div>");
}
return events.ToString();
}
return "no info provided";
}
catch (Exception e)
{
return "ERROR" + e;
}
}
public string loadHelpers(string id)
{
var cmd2 = new SqlCommand(@"SELECT * FROM fundrasier_helpers WHERE eventID='"+ id + "'" , con2);
con2.Open();
if (cmd2.ToString() != "")
{
SqlDataReader reader2;
StringBuilder helper = new StringBuilder();
helper.Append("<ul>");
try
{
reader2 = cmd2.ExecuteReader();
if (reader2.HasRows)
{
while (reader2.Read())
{
helper.Append("<li>" + reader2["firstName"] + " " + reader2["lastName"] + " " + reader2["phone"] + " " + reader2["shirtSize"] + "</li>");
}
}
reader2.Close();
}
catch (Exception e)
{
helper.Append("<li>No volunteers have signed up " + e + "</li>");
}
helper.Append("</ul>");
con2.Close();
return helper.ToString();
}
else
{
return "<ul><li>No volunteers have signed up</li></ul>";
}
}