0

[解決済み]、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 つ以上) を追加すると、データ グリッドはグリッド上の支払いと同じメンバーを表示します。私は何を間違っていますか???

4

2 に答える 2

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指定されたメンバーに一致するすべてのレコード (見つかった場合) を持つメンバーを返します。したがって、1 行 (およびおそらく最新の支払い) のみが必要な場合、クエリは次のようになります。

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
于 2013-06-20T08:03:44.623 に答える
0

それが左結合の仕組みです。http://www.w3schools.com/sql/sql_join_left.asp

値が 2 倍になるのは「結合」が原因です。支払いと同じ数のレコードが返されます。@gzaxxが提案したように、それらをグループ化することは良い考えかもしれません

支払いがない列に null がある場合、使用しているデータベースに応じて、クエリで ISNULL (mssql) ( http://www.w3schools.com/sql/sql_isnull.asp ) コマンドを使用して修正できます。 .

于 2013-06-20T08:12:28.077 に答える