[解決済み]、gzaxxの回答。
データベースではメンバーが 2 回挿入されていませんが、データグリッドでは 2 回表示されています。メンバーを追加するこのフォームと、メンバーの支払いを追加する別のフォームがあります。メンバーに複数の支払いを追加すると、そのメンバーがグリッドに 2 回表示されます。
メンバーをリストするには、私はこれを使用しています:
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 つの場合は、そのステータスが表示されます。しかし、新しい支払い (1 つ以上) を追加すると、データ グリッドはグリッド上の支払いと同じメンバーを表示します。私は何を間違っていますか???