Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在同一查询中进行插入和更新?_C#_Mysql - Fatal编程技术网

C# 是否可以在同一查询中进行插入和更新?

C# 是否可以在同一查询中进行插入和更新?,c#,mysql,C#,Mysql,我有一个名为members的表和一个名为membership records的表。目前,在表成员记录中,我有一个名为“月”的列,在该列中,我将为成员支付成员资格的月份进行保存。每次付款都会在datagridview中添加不同月份的新记录。检查图像,查看用户付款时它现在如何显示数据 如果我想用月份名称一月至十二月更改会员记录表,并希望填写每笔付款,例如填写列名称一月的会员John for month January,如果我还想为相同ID的会员John付款,假设ID为1,月份为2,它不会在数据库中添

我有一个名为members的表和一个名为membership records的表。目前,在表成员记录中,我有一个名为“月”的列,在该列中,我将为成员支付成员资格的月份进行保存。每次付款都会在datagridview中添加不同月份的新记录。检查图像,查看用户付款时它现在如何显示数据

如果我想用月份名称一月至十二月更改会员记录表,并希望填写每笔付款,例如填写列名称一月的会员John for month January,如果我还想为相同ID的会员John付款,假设ID为1,月份为2,它不会在数据库中添加新记录,但会为列2更新成员John ID 1?所以它会显示姓名John、DoB、OIB个人身份号码、性别、1月、2月等,一直到12月,每月或每年的会员类型以及会员费

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

这就是我想在datagridview中显示它的方式。请注意,我很快创建了这个表,它与上面图片中的不一样^^^,这里只是向您展示我的意思,我将删除它,并且我不会将其包含在我的数据库和项目中

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

id_clana=id_会员,mjesec=month,godina=year,vrsta=type,Mjesečna=Monthly,iznos=fee,Godišnja=year。这是我的代码的快速翻译,所以你们可以管理。

也许你们需要


如果已在第一个表中记录付款,则不要在第二个表中再次记录付款,只需将第一个表的数据转换为要显示的数据:

--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,如果这是你的拿手好戏的话——你会从示例中直接看到,它将节省你数小时的无聊编码、填充参数集合和将结果拖出读卡器以将它们变成强类型对象

你在一个查询中的意思是什么?这是两个不同的查询命令。在正常的会计系统中,即使您在一个月内收到30笔付款,您也会分别记录付款,并在报告级别将其分组为每月金额。记录单独的付款允许会计师进行对账。@AlwaysLearning我在不同的表中记录付款,datagridview中的输出是两个合并的表,成员和我记录付款的表。请以文本或DBFIDLE的形式发布您的表。翻译是一个很好的观点。@nbk我已经创建了那个表并在Workbench中插入了数据,我已经删除了它。我正在一个表中保存成员,然后在另一个表中保存付款,然后通过连接表1和两个成员和付款,将结果输出到datagridview中。我在payments表中添加了一个外键,这样当通过应用程序付款时,我就知道我在为哪个会员ID付款。好吧,现在在项目中开始使用Dapper已经太晚了,我必须先学会使用它,我的应用程序已经完成了98%,所以Dapper现在不是一个选项。也许在将来。无论如何,谢谢你的评论和解决方案。我正在尝试一种不同的方法,在表成员记录中设置Payed和Owes列,并在成员付款或未付款时将月份插入这两列中的一列。没有问题。如果你被卡住了,请随时回来。在你开始你的下一个项目之前,快速看一下Dapper——其实你并不知道你已经知道如何创建一个类,编写一个sql并形成一个sql参数列表;差不多就是这样-绝对不是EF,流畅的映射,折磨人的LINQ等等。祝你好运!嗯,事实上,我被卡住了哈哈。我已经放弃了我在原始帖子中写的全部想法,并添加了Payed和Owes专栏。现在,当会员约翰对我说他没有钱支付1月份的会员费时,我通过应用程序支付会员费,但我按下单选按钮,他欠我1月份的钱,效果很好。但是假设John在10天后回来对我说我有钱,然后我进入我的应用程序,选择John,选择他没有给我付款的月份一月,现在我选择Payed单选按钮。我将继续发表另一条评论。我的应用程序在datagr中添加了另一行,而不是更新他正在支付的当前行 idview提供了John在一月份支付的新信息。在datagridview中仍然可以看到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