华-fu 2022-01-26 09:53 采纳率: 66.7%
浏览 124
已结题

C#MVC 使用EF来循环执行SQL UPDATE更新语句偶尔出现数据未被更新问题

在使用C#MVC中的EF执行SQL UPDATE语句,偶尔出现有些数据未被更新,但是日志记录的更新语句和返回值都是正常的。

比如八条数据请求过来,日志记录执行的SQL为八条,且success记录的返回也是成功了八条,但是偶尔出现只有七条被更新,一条未被更新的情况。

更新代码如下
using (var db = dbcontext.GetContext())
                    {
                        string sql = "";
                        int success = 0;
                        string BatchNo;
                        string orderid;
                        foreach (var item in list)  //遍历数据写入数据库
                        {
                            BatchNo= Convert.ToString(item.BatchNo);
                            orderid = Convert.ToString(item.orderid);
                            sql = "select count(*) from mytable where orderid = '{0}'";
                            sql = string.Format(sql, item.orderid);
                            int y = db.Database.SqlQuery<int>(sql).FirstOrDefault();
                            if (y == 0)
                            {
                                sql = "update mytable set Orderid = '{0}',Isach='{1}' where BatchNo= '{2}'"; 
                                sql = string.Format(sql, orderid, 1, BatchNo);
                                success += db.Database.ExecuteSqlCommand(sql);
                                db.SaveChanges();
                                orderid = "";
                                logger.Info(sql);//记录执行的sql到日志
                            }
                            FGMPBatchNo = "";

                        }
                        logger.Info("请求数据为:" + data + "请求结果为:成功" + success + "条,失败:" + (list.Count - success) + "条");
                        
                        if (success == list.Count)
                        {
                            return GetSuccessMessage("记录数据成功");
                        }
                        else
                        {
                            return GetErrorMessage("成功记录:" + success + "条,失败:" + (list.Count - success) + "条");
                        }
                    }

使用日志记录了每条SQL语句,并记录了每次请求记录成功条数success,也查了数据库,该条件的数据的确是存在的,但是数据库该条数据未被更新。
望能解答疑问,感谢
  • 写回答

1条回答 默认 最新

  • HoWorlds 2022-01-26 10:33
    关注

    首先 你这个sql = "update mytable set Orderid = '{0}',Isach='{1}' where BatchNo= '{2}'";
    sql = string.Format(sql, orderid, 1, BatchNo); 其实可以直接sql = $"update mytable set Orderid = '{orderid}',Isach='{1}' where BatchNo= '{BatchNo}'"
    其二,最好不要循环执行修改,直接先看是什么数据库操作,直接 sql+拼接成一条长长的sql字符串,直接执行一次就可以了,效率好一点
    其三,得用事务执行,多条操作最好就是用到事务

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 3月11日
  • 已采纳回答 3月3日
  • 修改了问题 1月26日
  • 创建了问题 1月26日

悬赏问题

  • ¥15 cgictest.cgi文件无法访问
  • ¥20 删除和修改功能无法调用
  • ¥15 kafka topic 所有分副本数修改
  • ¥15 小程序中fit格式等运动数据文件怎样实现可视化?(包含心率信息))
  • ¥15 如何利用mmdetection3d中的get_flops.py文件计算fcos3d方法的flops?
  • ¥40 串口调试助手打开串口后,keil5的代码就停止了
  • ¥15 电脑最近经常蓝屏,求大家看看哪的问题
  • ¥60 高价有偿求java辅导。工程量较大,价格你定,联系确定辅导后将采纳你的答案。希望能给出完整详细代码,并能解释回答我关于代码的疑问疑问,代码要求如下,联系我会发文档
  • ¥50 C++五子棋AI程序编写
  • ¥30 求安卓设备利用一个typeC接口,同时实现向pc一边投屏一边上传数据的解决方案。