2017-09-26 34 views
1

在我的應用程序中,我創建行到sql表。如何加快sql創建過程

int findNewId = Entities.myTable.Where(a => a.Name == txtName.Text).Select(b => b.Id).FirstOrDefault(); 

for (int i = 0; i < incomingDtbl.Rows.Count; i++) 
{ 
    addNew.Id = findNewId; 
    addNew.Date = Convert.ToDateTime(incomingDtbl.Rows[i].ItemArray[2]); 
    addNew.Hour = Convert.ToInt32(incomingDtbl.Rows[i].ItemArray[3]); 
    ... 
    addNew.CreationDate = System.DateTime.Now; 
    Entities.myTable.Add(addNew); 
    Entities.SaveChanges(); 

} 

但我的incomingDtbl有130000行,所以它需要很長的時間。 有什麼辦法可以加快這個過程嗎?

我不能直接批量複製incomingDtbl,因爲它沒有newId。

+6

是否有'Entities.SaveChanges();'堅持更改數據庫?如果是這樣;你可以嘗試在每隔100行之後調用它,而不是在每行之後調用 –

+1

'因爲它通常沒有newId',考慮讓數據庫決定新的技術密鑰而不是軟件。數據庫相當不錯,它爲您節省了很多麻煩。 – oerkelens

+0

@oerkelens我的目標tbl有像列:logId,newId,日期,小時....所以我需要newId。 – moonyy88

回答

0

我也遇到類似的問題(我的170,000行)。這裏是我的解決方案:

public bool InsertData(List<MachineInfo> MachineInfo, string flag,int userID) 
    { 
     if (MachineInfo != null && flag != string.Empty) 
     { 
      List<T> attList = new List<T>(); 
      foreach (var item in MachineInfo) 
      { 
       T att = new T() 
       { 
        CreatedDate = DateTime.Now, 
        DateTime = item.DateTimeRecord, 
        EnrollNumber = item.EnrollNumber.ToString(), 
        IPFlag = flag, 
        SyncBy = userID 
       }; 
       attList.Add(att); 
      } 
      try 
      { 
       Entities context = null; 
       try 
       { 
        context = new Entities(); 
        context.Configuration.AutoDetectChangesEnabled = false; 

        int count = 0; 
        foreach (var entity in attList) 
        { 
         ++count; 
         context = AddToContext(context, entity, count, 100, true); 
        } 

        context.SaveChanges(); 
       } 
       finally 
       { 
        if (context != null) 
         context.Dispose(); 
       } 

       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
     } 
     return false; 
    } 
private Entities AddToContext(Entities context, T entity, int count, int commitCount, bool recreateContext) 
    { 
     context.Set<T>().Add(entity); 

     if (count % commitCount == 0) 
     { 
      context.SaveChanges(); 
      if (recreateContext) 
      { 
       context.Dispose(); 
       context = new Entities(); 
       context.Configuration.AutoDetectChangesEnabled = false; 
      } 
     } 

     return context; 
    } 

它執行非常快,因爲它將該記錄,還幫你驗證。

所有最好的!