比如八条数据请求过来,日志记录执行的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 = "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字符串,直接执行一次就可以了,效率好一点
其三,得用事务执行,多条操作最好就是用到事务