2017-04-19 47 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

你有一個快速的例子,我可以看看我不包圍我的頭在哪裏放置支票。謝謝你的幫助 –