2017-09-26 6 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();はデータベースに変更を永続化しますか?もしそうなら、 1行ごとに100行ごとに呼び出すことができます。 –

+1

は一般的にnewIdを持っているため、データベースでソフトウェアの代わりに新しい技術キーを決定させることを検討してください。データベースは非常に優れており、かなりの労力を節約できます。 – 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; 
    } 

:ここに私のソリューションです。

すべてベスト!

関連する問題