C# 如何在sql中联接两个表并显示结果事件A然后是所有与会者,事件B并显示所有与会者,等等
大家下午好 我正在创建一个管理页面,显示事件列表和自愿帮助的人。我有一张活动桌和一张志愿者桌 我将eventID存储到志愿者的表中,并且可以加入他们,但是当我加入他们时,我会为每个志愿者获得一个新行,该行还会再次显示活动名称 我想展示活动名称,并在活动名称下方展示志愿者 前 谁能给我指出正确的方向吗C# 如何在sql中联接两个表并显示结果事件A然后是所有与会者,事件B并显示所有与会者,等等,c#,sql,asp.net,join,C#,Sql,Asp.net,Join,大家下午好 我正在创建一个管理页面,显示事件列表和自愿帮助的人。我有一张活动桌和一张志愿者桌 我将eventID存储到志愿者的表中,并且可以加入他们,但是当我加入他们时,我会为每个志愿者获得一个新行,该行还会再次显示活动名称 我想展示活动名称,并在活动名称下方展示志愿者 前 谁能给我指出正确的方向吗 public string volunteers(){ SqlCommand cmd = new SqlCommand(@"SELECT* FROM fundraiser_youth
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";
}
public字符串(){
SqlCommand cmd=new SqlCommand(@“从筹款活动中选择*
左连接
fundrasier\u helpers ON fundraiser\u youth.id=fundrasier\u helpers.eventID
《报告时间》下的命令;“,con);
con.Open();
SqlDataReader;
reader=cmd.ExecuteReader();
if(reader.HasRows)
{
while(reader.Read())
{
DateTime reportTime=Convert.ToDateTime(读取器[1]);
DateTime gateTime=Convert.ToDateTime(读卡器[2]);
DateTime gameTime=Convert.ToDateTime(读卡器[3]);
志愿者。附加(“”);
志愿者。附加(“”);
志愿者。附加(“”);
志愿者。追加(“+reportTime.DayOfWeek+”+reportTime.Month+“/”+reportTime.Day+“/”+reportTime.Year+”);
志愿者.Append(“+reader[4].ToString()+”+reader[7].ToString()+“+reportTime.ToString”(“h:mm tt”,CultureInfo.InvariantCulture)+”);
志愿者。附加(“”);
志愿者。追加(“- ”+读取器[10]。ToString()+”+读取器[11]。ToString()+“
”;
志愿者。附加(“
”);
志愿者。附加(“”);
志愿者。附加(“”);
志愿者。附加(“”);
志愿者。附加(“”);
志愿者。附加(“”);
}
return.ToString();
}
返回“未提供任何信息”;
}
所述问题的第一个方面是选择列表Select*
将在查询中为每个联接行返回所有联接表的所有列。因此,您的每个助手都将筹款活动信息作为其行数据的一部分
维护的一个附带说明:select*
是“生产代码”的一个坏习惯,尤其是当您从索引(您是)的结果集中获取字段时,因为如果您向fundraiser\u youth
添加字段,所有代表来自fundraiser\u helpers
的字段的索引将不再与返回的结果集对齐,您的UI和此字段数据上的任何验证逻辑将中断。我强烈建议您明确指定所需列的列表,或者使用列名而不是索引位置将它们从reader
中取出,或者两者兼而有之
由于您是在C#中以编程方式消化结果,因此解决所述问题的最简单方法是首先更改
ORDER BY
子句,以便在执行任何其他操作之前按fundraiser_youth.id
对行进行排序。然后,在第一行上获取事件信息一次,生成事件标题和HTML中的第一个志愿者行,记住该事件ID,并在遍历生成其余志愿者HTML行的读取器时对照后续行的ID进行检查。只要事件ID匹配,就忽略事件字段,只提取/显示帮助器字段。当它们不同时,事件已更改,您需要重新检索下一个子标题的事件信息。以下是我如何解决问题的。可能不是最好的选择,但它很有效,感谢大家的输入,在生产代码中,我用列替换了select*。我创建了一个名为(loadHelpers)的新函数,并将当前事件的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>";
}
}
public字符串()
{
SqlCommand cmd=new SqlCommand(@“SELECT*FROM fundraiser_youth WHERE reportTime>=”+DateTime.Now+“'ORDER BY reportTime”,con);
con.Open();
SqlDataReader;
尝试
{
reader=cmd.ExecuteReader();
if(reader.HasRows)
{
while(reader.Read())
{
DateTime reportTime=Convert.ToDateTime(读卡器[“reportTime”]);
DateTime gateTime=Convert.ToDateTime(读卡器[“gateTime”]);
DateTime gameTime=Convert.ToDateTime(读卡器[“gameTime”]);
事件。附加(“”);
事件。附加(“”);
事件。附加(“”);
事件。追加(“+reportTime.DayOfWeek+”+reportTime.Month+“/”+reportTime.Day+“/”+reportTime.Year+”);
events.Append(“+reader[“eventName”].ToString()+”+reader[“location”].ToString()+“+reportTime.ToString”(“h:mm tt”,CultureInfo.InvariantCulture)+”);
Append(loadHelpers(reader[“id”].ToString());
事件。附加(“”);
事件。附加(“”);
事件。附加(“”);
事件。附加(“”);
}
return events.ToString();
}
返回“未提供任何信息”;
}
捕获(例外e)
{
返回“错误”+e;
}
}
公共字符串加载帮助程序(字符串id)
{
var cmd2=new SqlCommand(@“SELECT*FROM fundrasier_helpers,其中eventID='”+id+“'”,con2);
con2.Open();
如果(cmd2.ToString()!=“”)
{
SqlDataReader-reader2;
StringBuilder助手=新建StringBuilder();
helper.Append(“”);
尝试
{
reader2=cmd2.ExecuteReader();
if(reader2.HasRows)
{
while(reader2.Read())
{
H
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>";
}
}