如何更新数据库中已经存在的行?

发布于 2025-02-09 08:06:12 字数 3180 浏览 0 评论 0原文

在通过Excel文件上传和Epplus更新数据库中已经存在的行时,正在创建一个新的行,而不是更新已经存在的数据。

如何更新现有行而不是添加新行?

谢谢您的帮助

public class Insured
{
    [Key]
    public int id { get; set; }

    [Required]
    public string identifier { get; set; }

    public string policyno { get; set; }

    public string firstname { get; set; }
    public string lastname { get; set; }
    public string gender { get; set; }
    public int year { get; set; }
}

// Controller method
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ImportExcelFile(IFormFile ExcelFile)
{
    ViewBag.Message = "";

    if (ExcelFile != null)
    {
        var list = new List<Insured>();

        using (var stream = new MemoryStream())
        {
            await ExcelFile.CopyToAsync(stream);

            using (var package = new ExcelPackage(stream))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets ["Sheet1"];
                var rowcount = worksheet.Dimension.Rows;

                for (int row = 2; row <= rowcount; row++)
                {
                    list.Add(new Insured
                              {
                                  identifier = worksheet.Cells [row,1].Value.ToString().ToLower().Trim(),
                                  policyno = worksheet.Cells [row, 2].Value.ToString().Trim(),
                                  firstname = worksheet.Cells [row, 3].Value.ToString().Trim(),
                                  lastname = worksheet.Cells [row, 4].Value.ToString().Trim(),
                                  gender = worksheet.Cells [row, 5].Value.ToString().Trim(),
                                  gender = worksheet.Cells [row, 6].Value.ToString().Trim(),
                              }); 
                }
            }

            foreach (var item in list)
            {
                if (ModelState.IsValid)
                {
                    // check if record exist in the database
                    var query = from obj in _db.dbLifeData
                                where  obj.identifier == item.identifier.ToLower() && obj.policyno == item.policyno 
                                select obj;

                    if (query.Count() > 0)  // if row already exists
                    {
                        var query2 = from obj in _db.dbLifeData
                                     where obj.identifier == item.identifier.ToLower() && obj.policyno == item.policyno
                                           && obj.year <= item.year
                                     select obj;    //update the existing data in the database if year is greater

                        if (query2.Count() != 0)  
                        {
                            _db.dbLifeData.UpdateRange(item);
                            _db.SaveChanges();
                        }
                    }
                    else //if no record found add new row
                    {
                        _db.dbLifeData.AddRange(item);
                        _db.SaveChanges();
                    }
                }
            }
        }
    }
}

When updating a row that already exists in the database via an Excel file upload and EPPlus, a new row is being created instead of updating the data that already exists.

How can I update the existing row instead of getting a new row added?

Thank you for the kind assistance

public class Insured
{
    [Key]
    public int id { get; set; }

    [Required]
    public string identifier { get; set; }

    public string policyno { get; set; }

    public string firstname { get; set; }
    public string lastname { get; set; }
    public string gender { get; set; }
    public int year { get; set; }
}

// Controller method
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ImportExcelFile(IFormFile ExcelFile)
{
    ViewBag.Message = "";

    if (ExcelFile != null)
    {
        var list = new List<Insured>();

        using (var stream = new MemoryStream())
        {
            await ExcelFile.CopyToAsync(stream);

            using (var package = new ExcelPackage(stream))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets ["Sheet1"];
                var rowcount = worksheet.Dimension.Rows;

                for (int row = 2; row <= rowcount; row++)
                {
                    list.Add(new Insured
                              {
                                  identifier = worksheet.Cells [row,1].Value.ToString().ToLower().Trim(),
                                  policyno = worksheet.Cells [row, 2].Value.ToString().Trim(),
                                  firstname = worksheet.Cells [row, 3].Value.ToString().Trim(),
                                  lastname = worksheet.Cells [row, 4].Value.ToString().Trim(),
                                  gender = worksheet.Cells [row, 5].Value.ToString().Trim(),
                                  gender = worksheet.Cells [row, 6].Value.ToString().Trim(),
                              }); 
                }
            }

            foreach (var item in list)
            {
                if (ModelState.IsValid)
                {
                    // check if record exist in the database
                    var query = from obj in _db.dbLifeData
                                where  obj.identifier == item.identifier.ToLower() && obj.policyno == item.policyno 
                                select obj;

                    if (query.Count() > 0)  // if row already exists
                    {
                        var query2 = from obj in _db.dbLifeData
                                     where obj.identifier == item.identifier.ToLower() && obj.policyno == item.policyno
                                           && obj.year <= item.year
                                     select obj;    //update the existing data in the database if year is greater

                        if (query2.Count() != 0)  
                        {
                            _db.dbLifeData.UpdateRange(item);
                            _db.SaveChanges();
                        }
                    }
                    else //if no record found add new row
                    {
                        _db.dbLifeData.AddRange(item);
                        _db.SaveChanges();
                    }
                }
            }
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小霸王臭丫头 2025-02-16 08:06:12

之所以因为Excel中的数据没有主键“ ID”,并且数据库中的主键设置为自动提出,因此“ update

”工作:

var list = new List<Insured>()
            {
                new Insured(){identifier="i1",policyno="p1",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i2",policyno="p2",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i3",policyno="p3",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i4",policyno="p4",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i5",policyno="p5",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i6",policyno="p6",firstname="firstname",lastname="lastname",gender="gender",year=2022}
            };
            var insurelistindb = _context.Insured.ToList();
            list.ForEach(x =>
            {
                var TargetinDb= insurelistindb.FirstOrDefault(y => y.identifier == x.identifier && y.policyno == x.policyno);
                if (TargetinDb != null)
                {
                    TargetinDb.year = x.year;
                    TargetinDb.gender = x.gender;
                    TargetinDb.firstname = x.firstname;
                    TargetinDb.lastname = x.lastname;
                    _context.Entry(TargetinDb).State = EntityState.Modified;
                } 
            });           
            _context.SaveChanges(); 

结果:

It wa because the data in your excel does not have the primary key"Id",and the primary key in your database was set to auto-increment,so the "Update"turn to "Add" Automaticlly

I tried as below and it could work:

var list = new List<Insured>()
            {
                new Insured(){identifier="i1",policyno="p1",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i2",policyno="p2",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i3",policyno="p3",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i4",policyno="p4",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i5",policyno="p5",firstname="firstname",lastname="lastname",gender="gender",year=2022},
                new Insured(){identifier="i6",policyno="p6",firstname="firstname",lastname="lastname",gender="gender",year=2022}
            };
            var insurelistindb = _context.Insured.ToList();
            list.ForEach(x =>
            {
                var TargetinDb= insurelistindb.FirstOrDefault(y => y.identifier == x.identifier && y.policyno == x.policyno);
                if (TargetinDb != null)
                {
                    TargetinDb.year = x.year;
                    TargetinDb.gender = x.gender;
                    TargetinDb.firstname = x.firstname;
                    TargetinDb.lastname = x.lastname;
                    _context.Entry(TargetinDb).State = EntityState.Modified;
                } 
            });           
            _context.SaveChanges(); 

Result:
enter image description here

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文