簡體   English   中英

使用LINQ將大量數據插入數據庫

[英]Insert large amount of data into database using LINQ

我想在ASP.NET MVC中使用Linq將大約100萬條記錄插入到數據庫中。 但是,當我嘗試以下代碼時,它不起作用。 它正在拋出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萬行。

像這樣的批量插入在LINQtoSQL中非常低效。 每個插件都會創建至少三個對象( DataRowHotelAmenities對象及其跟蹤記錄),從而在不需要的對象上占用內存。

鑒於您已經擁有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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM