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

时间:2017-04-19 22:28:03

标签: c# sql asp.net join

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

2 个答案:

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