使用LINQ将大量数据插入数据库

本文关键字:数据 插入 数据库 LINQ 使用 | 更新日期: 2023-09-27 18:19:21

我想在ASP中使用Linq插入大约100万条记录。净MVC。但是当我尝试下面的代码时,它不起作用。它抛出了一个OutOfMemoryException。这个循环也花了3天时间。有人能帮我一下吗??

db.Database.ExecuteSqlCommand("DELETE From [HotelServices]");
DataTable tblRepeatService = new DataTable();
tblRepeatService.Columns.Add("HotelCode",typeof(System.String));
tblRepeatService.Columns.Add("Service",typeof(System.String));
tblRepeatService.Columns.Add("Category",typeof(System.String));
foreach (DataRow row in xmltable.Rows)
{
     string[] servicesarr = Regex.Split(row["PAmenities"].ToString(), ";");
     for (int a = 0; a < servicesarr.Length; a++)
     {
         tblRepeatService.Rows.Add(row["HotelCode"].ToString(), servicesarr[a], "PA");
     }
     String[] servicesarrA = Regex.Split(row["RAmenities"].ToString(), ";");
     for (int b = 0; b < servicesarrA.Length; b++)
     {
         tblRepeatService.Rows.Add(row["hotelcode"].ToString(), servicesarrA[b], "RA");
     }
}
HotelAmenties _hotelamenties;
foreach (DataRow hadr in tblRepeatService.Rows)
{
     _hotelamenties = new HotelAmenties();
     _hotelamenties.Id = Guid.NewGuid();
     _hotelamenties.ServiceName = hadr["Service"].ToString();
     _hotelamenties.HotelCode = hadr["HotelCode"].ToString();
     db.HotelAmenties.Add(_hotelamenties);
}
db.SaveChanges();

tblRepeatService表大约有100万行

使用LINQ将大量数据插入数据库

这样的批量插入在LINQtoSQL中效率非常低。每次插入至少创建三个对象(DataRow, HotelAmenities对象和跟踪记录),在不需要的对象上消耗内存。

如果已经有了DataTable,那么可以使用System.Data.SqlClient.SqlBulkCopy将表的内容推送到SQL服务器上的临时表,然后使用单个insert语句将数据加载到最终目的地。这是迄今为止我发现的将数千条记录从内存移动到SQL的最快方式。

如果性能不重要,这是一个一次性的工作,你可以坚持你使用的方式。你的问题是你只在最后保存,所以实体框架必须存储和生成100万次操作的SQL,修改你的代码,这样你就可以保存每1000次左右的插入,而不是只在最后,它应该工作得很好。

int i = 0;
foreach (DataRow hadr in tblRepeatService.Rows)
{ 
     _hotelamenties = new HotelAmenties();
     _hotelamenties.Id = Guid.NewGuid();
     _hotelamenties.ServiceName = hadr["Service"].ToString();
     _hotelamenties.HotelCode = hadr["HotelCode"].ToString();
     db.HotelAmenties.Add(_hotelamenties);
     if((i%1000)==0){
     db.SaveChanges();
     }
     i++;
}    
db.SaveChanges();