如何使用 Loop 语句从 CSV 文件插入数据库
How to Insert to DB from CVS file using Loop statement
我的代码有问题。我使用上传的逗号分隔 (CSV) 文件插入到我的数据库中,该文件包含 5 行。第一行成功插入到数据库中,但在第二个循环中插入第二行时遇到错误:
Cannot insert explicit value for identity column in table 'bdoToDbs' when IDENTITY_INSERT is set to OFF.
这是我的循环代码
while (i < users.Count)
{
ViewBag.CompanyCode = users[i].CompanyCode;
ViewBag.ProductCode = users[i].ProductCode;
ViewBag.TransactionDate = users[i].TransactionDate;
ViewBag.TransactionTime = users[i].TransactionTime;
ViewBag.OriginatingBranch = users[i].OriginatingBranch;
ViewBag.CustomerNumber = users[i].CustomerNumber;
ViewBag.TransactionOrigin = users[i].TransactionOrigin;
ViewBag.TypeOfPayment = users[i].TypeOfPayment;
ViewBag.CheckNumber = users[i].CheckNumber;
ViewBag.TransactionAmount = users[i].TransactionAmount;
ViewBag.CustomerName = users[i].CustomerName;
bdoToDb.CompanyCode = ViewBag.CompanyCode;
bdoToDb.ProductCode = ViewBag.ProductCode;
bdoToDb.TransactionDate = ViewBag.TransactionDate;
bdoToDb.TransactionTime = ViewBag.TransactionTime;
bdoToDb.OriginatingBranch = ViewBag.OriginatingBranch;
bdoToDb.CustomerNumber = ViewBag.CustomerNumber;
bdoToDb.TransactionOrigin = ViewBag.TransactionOrigin;
bdoToDb.TypeOfPayment = ViewBag.TypeOfPayment;
bdoToDb.CheckNumber = ViewBag.CheckNumber;
bdoToDb.TransactionAmount = ViewBag.TransactionAmount;
bdoToDb.CustomerName = ViewBag.CustomerName;
bdoToDb.UserName = ViewBag.DisplayName;
bdoToDb.UserIP = HttpContext.Connection.RemoteIpAddress.ToString();
bdoToDb.UserDate = DateTime.Now.ToString("MM/dd/yyyy");
i++;
_context.Add(bdoToDb);
await _context.SaveChangesAsync();
});
return RedirectToAction(nameof(Index));
}
EF 核心的优点之一是它会跟踪更改,然后您可以通过保存一次提交所有这些更改。如果你移动
await _context.SaveChangesAsync();
在你的 while 循环之外(编辑:并根据下面的精明评论在每次迭代中构造一个新对象),它将起作用。在身份插入表的情况下,您不设置对象的 ID,但为了能够知道该 ID 最终是什么,在您调用保存更改后,它会更新对象的 ID 字段。因此,在您第一次保存后,ID 字段设置为下一个 ID,然后您更新对象的所有属性,然后使用 .Add 以便它尝试插入它,但 ID 已经设置并标记为已修改。您也可以通过每次构造一个对象的新实例来解决这个问题,或者 EF 有办法清除该 ID 并将其标记为未修改......但我建议将您的保存移到最后,因为它可能会更多高效的。如果这是针对非常大量的数据,也许每次传递 1000 条记录时都保存一次,但除非数据量很大,否则不用担心。
对于后续查询,大致如下:(您实际上只需要不同的对象实例,因为 EF 将它们存储在内存中)
ViewBag.TransactionAmount = users[i].TransactionAmount;
ViewBag.CustomerName = users[i].CustomerName;
// added constructor
bdoToDb = new BdoToDb(); // <- don't know name of your class
bdoToDb.CompanyCode = ViewBag.CompanyCode;
bdoToDb.ProductCode = ViewBag.ProductCode;
我的代码有问题。我使用上传的逗号分隔 (CSV) 文件插入到我的数据库中,该文件包含 5 行。第一行成功插入到数据库中,但在第二个循环中插入第二行时遇到错误:
Cannot insert explicit value for identity column in table 'bdoToDbs' when IDENTITY_INSERT is set to OFF.
这是我的循环代码
while (i < users.Count)
{
ViewBag.CompanyCode = users[i].CompanyCode;
ViewBag.ProductCode = users[i].ProductCode;
ViewBag.TransactionDate = users[i].TransactionDate;
ViewBag.TransactionTime = users[i].TransactionTime;
ViewBag.OriginatingBranch = users[i].OriginatingBranch;
ViewBag.CustomerNumber = users[i].CustomerNumber;
ViewBag.TransactionOrigin = users[i].TransactionOrigin;
ViewBag.TypeOfPayment = users[i].TypeOfPayment;
ViewBag.CheckNumber = users[i].CheckNumber;
ViewBag.TransactionAmount = users[i].TransactionAmount;
ViewBag.CustomerName = users[i].CustomerName;
bdoToDb.CompanyCode = ViewBag.CompanyCode;
bdoToDb.ProductCode = ViewBag.ProductCode;
bdoToDb.TransactionDate = ViewBag.TransactionDate;
bdoToDb.TransactionTime = ViewBag.TransactionTime;
bdoToDb.OriginatingBranch = ViewBag.OriginatingBranch;
bdoToDb.CustomerNumber = ViewBag.CustomerNumber;
bdoToDb.TransactionOrigin = ViewBag.TransactionOrigin;
bdoToDb.TypeOfPayment = ViewBag.TypeOfPayment;
bdoToDb.CheckNumber = ViewBag.CheckNumber;
bdoToDb.TransactionAmount = ViewBag.TransactionAmount;
bdoToDb.CustomerName = ViewBag.CustomerName;
bdoToDb.UserName = ViewBag.DisplayName;
bdoToDb.UserIP = HttpContext.Connection.RemoteIpAddress.ToString();
bdoToDb.UserDate = DateTime.Now.ToString("MM/dd/yyyy");
i++;
_context.Add(bdoToDb);
await _context.SaveChangesAsync();
});
return RedirectToAction(nameof(Index));
}
EF 核心的优点之一是它会跟踪更改,然后您可以通过保存一次提交所有这些更改。如果你移动
await _context.SaveChangesAsync();
在你的 while 循环之外(编辑:并根据下面的精明评论在每次迭代中构造一个新对象),它将起作用。在身份插入表的情况下,您不设置对象的 ID,但为了能够知道该 ID 最终是什么,在您调用保存更改后,它会更新对象的 ID 字段。因此,在您第一次保存后,ID 字段设置为下一个 ID,然后您更新对象的所有属性,然后使用 .Add 以便它尝试插入它,但 ID 已经设置并标记为已修改。您也可以通过每次构造一个对象的新实例来解决这个问题,或者 EF 有办法清除该 ID 并将其标记为未修改......但我建议将您的保存移到最后,因为它可能会更多高效的。如果这是针对非常大量的数据,也许每次传递 1000 条记录时都保存一次,但除非数据量很大,否则不用担心。
对于后续查询,大致如下:(您实际上只需要不同的对象实例,因为 EF 将它们存储在内存中)
ViewBag.TransactionAmount = users[i].TransactionAmount;
ViewBag.CustomerName = users[i].CustomerName;
// added constructor
bdoToDb = new BdoToDb(); // <- don't know name of your class
bdoToDb.CompanyCode = ViewBag.CompanyCode;
bdoToDb.ProductCode = ViewBag.ProductCode;