2013-06-20 74 views
0

[已解决],gzaxx的答案。在数据网格上显示两个相同的数据

尽管在数据库中一个成员没有被插入两次,但在数据网格中却显示了两次! 我有我添加成员的这个表单,以及我添加成员付款的另一个表单。当我向会员添加超过1笔付款时,该会员会在网格中显示两次。

要列出成员我使用这个:

 public List<Member> ListMembers() 
     { 
      List<Member> Members = new List<Member>(); 


      string STATUS = "SELECT m.Id, m.Name,m.Surname, m.EntryDate, p.EndDay FROM Members m left join Payments p on m.Id = p.MemberId order by m.Id "; 
      using (sqlConnection = new SqlConnection(sqlConnectionString_WORK)) 
      { 
       sqlConnection.Open(); 

       using (SqlCommand sqlCommand = new SqlCommand(STATUS, sqlConnection)) 
       { 
        var sqlReader = sqlCommand.ExecuteReader(); 

        while (sqlReader.Read()) 
        { 
         var member = new Member 
         { 
          Id = Convert.ToInt32(sqlReader["Id"]), 
          Name = sqlReader["Name"].ToString(), 
          Surname = sqlReader["Surname"].ToString(), 
          EntryDate = Convert.ToDateTime(sqlReader["EntryDate"]) 
         }; 

         if (sqlReader["EndDay"].ToString() != "") 
         if (Convert.ToDateTime(sqlReader["EndDay"]) < DateTime.Today) 
         { 
          member.Status = Status.Unpaid.ToString(); 
         } 

         else 
         { 
          member.Status = Status.Paid.ToString(); 
         } 

         Members.Add(member); 
        } 
       } 
      } 

      return Members; 
     } 

付款:

 public List<Payment> ListPayments(Payment entity) 
     { 
      List<Payment> Payments = new List<Payment>(); 

      string SELECT = "SELECT * FROM Payments WHERE MemberId = @MemberId"; 

      using (sqlConnection = new SqlConnection(sqlConnectionString_WORK)) 
      { 
       sqlConnection.Open(); 

       using (SqlCommand sqlCommand = new SqlCommand(SELECT, sqlConnection)) 
       { 
        sqlCommand.Parameters.Add("@MemberId", SqlDbType.Int).Value = entity.MemberId; 

        var sqlReader = sqlCommand.ExecuteReader(); 

        while (sqlReader.Read()) 
        { 
         var payment = new Payment 
         { 
          Id = Convert.ToInt32(sqlReader["Id"]), 
          MemberId = Convert.ToInt32(sqlReader["MemberId"]), 
          Amount = Convert.ToDecimal(sqlReader["Amount"]), 
          StartDay = Convert.ToDateTime(sqlReader["StartDay"]), 
          EndDay = Convert.ToDateTime(sqlReader["EndDay"]) 
         }; 

         Payments.Add(payment); 
        } 
       } 
      } 

      return Payments; 
     } 

如果会员没有付款,它会显示什么给它的状态栏。如果会员有一笔付款,它将显示其状态。但是,如果我添加新的付款(多于一个),数据网格将显示与其在网格上的付款相同的成员。我究竟做错了什么 ???

回答

1

这个查询:

SELECT m.Id, m.Name,m.Surname, m.EntryDate, p.EndDay FROM Members m left join Payments p on m.Id = p.MemberId order by m.Id 

将返回(如果找到)所有Payment.EndDay记录与给定成员匹配的成员。所以,如果你只想要一行(也许是最新的付款),那么你的查询应该是这样的:

SELECT m.Id, m.Name,m.Surname, m.EntryDate, MAX(p.EndDay) as EndDay 
FROM Members m left join Payments p on m.Id = p.MemberId 
GROUP BY m.Id, m.Name,m.Surname, m.EntryDate 
order by m.Id 
+0

这只显示一个成员,所以它的固定方式......但它没有得到最后一笔付款。 :\ – Etrit

+0

它最新'EndDay'。最新的payemnt是否与EndDay最新版本相同? – gzaxx

+0

哦,没关系!我没有检查是否有一个日期已经比我注册的日期已经很大(不知道说出正确的词)。它工作完美。谢谢 :) – Etrit

相关问题