首页 > 解决方案 > 是否可以在同一个查询中进行插入和更新?

问题描述

我有一个名为 members 的表和一个名为 members 记录的表。目前在表会员记录中,我有一个名为月份的列,我将在其中保存会员支付会员费的月份。每次付款都会在 datagridview 中添加新记录,但月份不同。检查图像以查看用户付款时它现在如何显示数据。

在此处输入图像描述

如果我要使用月份名称(1 月至 12 月)更改会员记录表,并且我想填写每笔付款,例如会员 John 一月,它填充列名 January,如果我也想为会员 John 付款(相同的 ID,假设 ID 1) 和二月份,它不会在数据库中添加新记录,而是更新列二月份的成员 John ID 1?所以它会一直显示姓名(John)、DoB、OIB(个人身份证号)、性别、1 月、2 月等,一直到 12 月、会员类型(每月或每年)和会员费?

基本上,我只想为每个付款的成员显示一条记录,但在一条记录中,它保存所有月份,并且在不同月份的每次付款中,它都会添加已支付的月份成员。

这就是我想在 datagridview 中显示它的方式。请注意,我快速制作了这张表,它与上图中的不一样^^,它在这里只是为了向您展示我的意思,我会删除它,我不会将它包含在我的数据库和我的项目中。

在此处输入图像描述

 private void Plati_Clanarinu_tipka_Click(object sender, EventArgs e)
    {
        MySqlConnection connection;
        string conString = "server=localhost; database=bazakudsumari; uid=David; password=root;";
        try
        {
            connection = new MySqlConnection();
            connection.ConnectionString = conString;
            connection.Open();

            if (string.IsNullOrWhiteSpace(iznos_clanarine.Text) || (string.IsNullOrWhiteSpace(odaberi_mjesec.Text)) || (string.IsNullOrWhiteSpace(godina_uplate_clanarine.Text)))
            {
                MessageBox.Show(" Ispunite sva polja prije naplate članarine! ");
            }
            else
            {
                string Query = "INSERT INTO evidencija_clanarina (id_clana, mjesec, godina, vrsta, iznos) VALUES (@id_clana, @mjesec, @godina, @vrsta, @iznos)";

                using (MySqlCommand command = new MySqlCommand(Query, connection))
                {
                    command.Parameters.AddWithValue("@id_clana", Convert.ToInt32(id_clana.Text));
                    command.Parameters.AddWithValue("@mjesec", odaberi_mjesec.Text);
                    command.Parameters.AddWithValue("@godina", godina_uplate_clanarine.Text);
                    if (mjesecna_clanarina.Checked)
                    {
                        command.Parameters.AddWithValue("@vrsta", "Mjesečna");
                        command.Parameters.AddWithValue("@iznos", iznos_clanarine.Text);
                    }
                    else
                    {
                        command.Parameters.AddWithValue("@vrsta", "Godišnja");
                        command.Parameters.AddWithValue("@iznos", iznos_clanarine.Text);
                    }

                    command.ExecuteNonQuery();
                }

                MessageBox.Show("Uspješno plaćena članarina!");

                DialogResult dialogResult = MessageBox.Show(" Želite li naplatiti još jednu članarinu? ", "", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                {
                    this.Focus();
                }
                else
                {
                    this.Close();
                }

                odaberi_mjesec.Text = string.Empty;
                iznos_clanarine.Text = string.Empty;
                godina_uplate_clanarine.Text = string.Empty;
                mjesecna_clanarina.Checked = false;
                godisnja_clanarina.Checked = false;
                baza_podataka_clanovi_clanarine.Refresh();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

这是我目前用于付款的代码,所有代码都是我的语言(克罗地亚语),我知道我需要更改查询和参数。我需要知道是否有可能做我所要求的以及如何去做。

(id_clana = id_member,mjesec = 月,godina = 年,vrsta = 类型,Mjesečna = 每月,iznos = 费用,Godišnja = 每年)。这是我在代码中的快速翻译,以便你们管理。

标签: c#mysql

解决方案


如果您已经在第一个表中记录付款,请不要在第二个表中再次记录它们,只需将第一个表数据转换为您要显示的内容:

--assumed structure of payments table
MemberId, PaymentDate, Type, Amount
1, 2001-01-01, fee, 30
1, 2001-02-01, fee, 20
1, 2001-02-02, fee, 10

--assumes structure of members table
Id, Name
1, John

询问:

SELECT
  m.Id,
  m.Name,
  SUM(CASE WHEN MONTH(p.PaymentDate) = 1 THEN p.Amount END) as JanTotal,
  SUM(CASE WHEN MONTH(p.PaymentDate) = 2 THEN p.Amount END) as FebTotal,
  SUM(CASE WHEN MONTH(p.PaymentDate) = 3 THEN p.Amount END) as MarTotal,
  ...
  SUM(CASE WHEN MONTH(p.PaymentDate) = 12 THEN p.Amount END) as DecTotal
FROM
  Members m
  INNER JOIN Payments p ON m.id = p.memberid
WHERE
  p.Type = 'fee' and YEAR(p.PaymentDate) = 2001
GROUP BY m.Id, m.Name

输出:

1,John,30,30,0,0,0,0,0,0,0,0,0,0

顺便说一句,您是否知道您编写的用于创建 sql 命令、设置其文本、填充其参数、运行它等的 30 多行代码可以通过使用 Dapper 减少到仅一行?看看 - 不像实体框架那么重,如果那是你的包,你仍然可以自己编写 sql - http://dapper-tutorial.net - 你会直接从示例中看到它可以节省你几个小时无聊的编码填充参数集合并将结果拖出阅读器以将它们变成强类型对象


推荐阅读