C# 如何在sql中联接两个表并显示结果事件A然后是所有与会者,事件B并显示所有与会者,等等

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

大家下午好

我正在创建一个管理页面,显示事件列表和自愿帮助的人。我有一张活动桌和一张志愿者桌

我将eventID存储到志愿者的表中,并且可以加入他们,但是当我加入他们时,我会为每个志愿者获得一个新行,该行还会再次显示活动名称

我想展示活动名称,并在活动名称下方展示志愿者

谁能给我指出正确的方向吗

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>";
        }
    }