2017-04-19 46 views
0

下午好一切,如何加入SQL两个表,并显示结果事件A,那么所有参加者,事件B和显示所有参加者等

我创建一个管理页面,显示事件列表和那些自愿帮助的人。我有一张桌子供参加活动,另一张供志愿者参加。

我将eventID存储在志愿者的表中,并且能够加入他们,但是当我加入他们时,我为每个志愿者都获得了一个新行,这个行也再次显示了事件名称。

我想显示事件名称并在事件名称下方显示志愿者。

ex。

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

数据库引擎请 – maSTAShuFu

+0

通常你会volunteerMaster,EventMaster和VolunteerEvents表 – maSTAShuFu

+0

不相关的问题,但我会强烈* *建议不要使用数字索引你的'reader'对象。它使得代码非常难以遵循/维护,并且很容易破坏。您应该使用'reader [“ColumnName”]'。它的意图更清晰。 (在同样的说明中,你应该不会使用'SELECT *'出于同样的原因,请列出你需要的列。) – Siyual

回答

0

下面是我如何解决我的问题。可能不是最好的选择,但它的工作原理,感谢大家的投入,并在生产代码中,我用列替换了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>"; 
    } 
} 
0

您声明的问题的第一个方面是选择列表。 Select *将返回查询中每个连接行的所有连接表的所有列。因此,每个助手都会将筹款活动信息作为其行数据的一部分。

维护的一个注意事项:select *是“生产代码”的坏习惯,特别是如果您通过索引(您是)从结果集中获取字段,因为如果将字段添加到fundraiser_youth,代表fundraiser_helpers字段的所有索引将不再与返回的结果集相对应,并且您的UI和该字段数据上的任何验证逻辑将会中断。我强烈建议您明确指定所需列的列表,使用列名称而不是索引位置将它们从reader中取出,或者两者都使用。

由于您正在以C#编程方式消化结果,所以最容易解决的问题是首先更改ORDER BY子句,以便在其他任何操作之前按行排序fundraiser_youth.id。然后,在第一行获取事件信息一次,在HTML中生成事件头和第一个志愿者行,记住事件ID,并在迭代通过读者生成其他志愿者时对照后续行的ID进行检查HTML行。只要事件ID匹配,就忽略事件字段并仅提取/显示帮助器字段。当它们不同时,事件发生了变化,您需要重新检索下一个子标题的事件信息。

+0

你有一个快速的例子,我可以看看我不包围我的头在哪里放置支票。谢谢你的帮助 –