2017-09-26 1 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 행과 비슷하므로 오래 걸립니다. 이 프로세스를 빠르게 진행할 수있는 방법이 있습니까?

newId가 없으므로 incomingDtbl을 직접 대량 복사 할 수 없습니다.

+6

'Entities.SaveChanges(); '는 변경 사항을 데이터베이스에 유지합니까? 그렇다면; 당신은 단지 하나의 행이 다가올 때마다 100 행마다 호출을 시도 할 수 있습니다. 왜냐하면 일반적으로 newId가 없기 때문에 –

+1

이 있기 때문에 데이터베이스가 소프트웨어 대신 새로운 기술 키를 결정하도록 고려하는 것이 좋습니다. 데이터베이스는 꽤 좋으며, 번거롭지 않게 저장됩니다. – oerkelens

+0

@oerkelens 내 목적지 tbl에 열이 있습니다 : logId, newId, date, hour .... 그래서 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; 
    } 

: 여기 내 솔루션입니다.

모두 최고 !!!