如何在C#mysql中更新单行

时间:2016-09-07 13:37:34

标签: c# mysql

我的问题是

  1. 它使用相同的ID更新所有数据。因为我有一个具有相同ID的多个数据。 [见下图]。

  2. 我想只更新接近过期的行(30天)。我不想对那些已经过期的物品做任何事情。

  3. 这是我的代码:

            for (int i = 0; i < dataGridViewPOS.Rows.Count; i++)
            {
                cmd = new MySqlCommand(@"UPDATE inventory2 SET quantity = @quantity WHERE itemid = @itemid ORDER BY expiry", sqlconnection);
                //codehere
            }
    

    Screenshot

    由于

    更新

           for (int i = 0; i < dataGridViewPOS.Rows.Count; i++)
            {
                cmd = new MySqlCommand(@"SELECT * FROM inventory2 WHERE itemid = @itemid ORDER BY expiry", sqlconnection);
                //codehere
    
                cmd = new MySqlCommand(@"UPDATE inventory2 SET quantity = @quantity WHERE itemid = @itemid AND CURDATE() < expiry ORDER BY expiry", sqlconnection);
    
                //codehere
            }
    

3 个答案:

答案 0 :(得分:1)

您需要检查SQL中的过期时间  即

WHERE itemid = @itemid and CURDATE() < expiry

你的确切性质取决于你如何定义“近”

WHERE itemid = @itemid and DATE_ADD(CURDATE(),INTERVAL 30 DAY) < expiry 

这将在到期后的30天内

一旦你有“近”日期,你就可以与选择最大值

组合
AND expiry = (SELECT MAX(expiry) FROM inventory2 WHERE itemid = @itemid)

所以得到最大的

编辑:您添加的信息表示您要编辑未过期的记录,这与原始问题似乎意味着您需要执行的操作完全相反

expiry BETWEEN CURDATE() and DATE_ADD(CURDATE(),INTERVAL 30 DAY)

这将获得在接下来的30天内到期但尚未到期的所有内容

答案 1 :(得分:1)

也许更贴近:

UPDATE inventory2 
    SET [quantity] = @quantity 
    where [itemid] = @itemid 
        AND [expiry] between CURDATE() and DATE_ADD(CURDATE(),INTERVAL 30 DAY) 

您的命令代码将更改为:

cmd = new MySqlCommand(@"UPDATE inventory2 SET quantity = @quantity WHERE itemid = @itemid AND [expiry] between CURDATE() and DATE_ADD(CURDATE(),INTERVAL 30 DAY", sqlconnection);          

这将更新inventoryI匹配的inventory2中的所有行,并且有效期限小于当前日期加上30天。

编辑以反映评论的更新要求:项目未过期,项目在30天内到期

答案 2 :(得分:0)

肯定你会有一个唯一的id表。为什么不首先执行选择查询以获取唯一ID,然后使用唯一ID引用更新该行。实际上,您也应该能够在一个查询中合并它们。底线是使用唯一ID并在选择查询中仅返回1行,然后以接近过期的方式对其进行排序。