2010-08-21 6 views
1

이것은 내 코드입니다C#의 여러 foreach 루프에서 SQLite 삽입을 실행 하시겠습니까?

CommandText를 설정하는 것은 루프에서가 아닌 한 번만 수행해야한다는 것을 읽었지 만 foreach에서 개별 항목 데이터를 가져 오는 방법은 무엇입니까? 작동하는 솔루션 : 그 코드를 리팩토링 똑똑

사람, 즉 좋은 :)

using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction()) 
{ 
    using (SQLiteCommand com = new SQLiteCommand(DataAccess.ConnectionManager)) 
    { 
     // How can I add the parameters here if they are only known in the foreach loop? 
     com.Parameters.Add(new SQLiteParameter("@date", day.SchooldayDate)); 
     com.Parameters.Add(new SQLiteParameter("@periodnumber", period.PeriodNumber)); 
     com.Parameters.Add(new SQLiteParameter("@schoolclasscode", period.SchoolclassCode)); 


     foreach (var week in weekList) 
     { 
      foreach (var day in week.Days) 
      { 
       foreach (var period in day.Periods) 
       { 
        com.CommandText = "Insert into tablename (date,periodnumber,schoolclasscode) Values (@date,@periodnumber,@schoolclasscode)"; 

       } 
      } 
     } 

     com.ExecuteNonQuery(); 
    } 
    trans.Commit();     
} 

UPDATE가 될 것입니다!

using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction()) 
      { 
       using (SQLiteCommand com = new SQLiteCommand(DataAccess.ConnectionManager)) 
       { 
        com.CommandText = "Insert into lessonday (lessondate,lessonnumber,schoolclasscode) VALUES (@lessondate,@lessonnumber,@schoolclasscode)"; 

        SQLiteParameter p1 = new SQLiteParameter("@lessondate", DbType.DateTime); 
        SQLiteParameter p2 = new SQLiteParameter("@lessonnumber", DbType.Int32); 
        SQLiteParameter p3 = new SQLiteParameter("@schoolclasscode", DbType.String); 

        com.Parameters.Add(p1); 
        com.Parameters.Add(p2); 
        com.Parameters.Add(p3); 

        foreach (var week in weekList) 
        { 
         foreach (var day in week.Days) 
         { 
          p1.Value = day.SchooldayDate; 
          foreach (var period in day.Periods) 
          { 
           p2.Value = period.PeriodNumber; 
           p3.Value = period.SchooclassCode; 

           com.ExecuteNonQuery(); 
          } 
         } 
        } 
       } 
       trans.Commit(); 
      } 
     } 
+0

네, 그게 올바른 방법입니다 !! 매개 변수가있는 쿼리를 사용하여 삽입을 하나의 큰 트랜잭션으로 묶으면 Sqlite가 훨씬 더 빠릅니다. – TTT

+0

네, 그것은 펠트 초보다 덜 빠른 4000 삽입물이었습니다. – Elisabeth

+0

0,488 초에 5 열의 하하가있는 40K 행을 삽입하면 더 미쳤습니다. Sqlite는 매우 빠릅니다. – Elisabeth

답변

0

글쎄, 당신은 루프를 움직일 수 : 나에게 조금 추한 것 같습니다 그러나

using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction()) 
{ 
    foreach (var week in weekList) 
    { 
    foreach (var day in week.Days) 
    { 
     foreach (var period in day.Periods) 
     { 
     using (SQLiteCommand com = new SQLiteCommand(...)) 
     { 
      com.Parameters.Add(new SQLiteParameter(...)); 
      com.Parameters.Add(new SQLiteParameter(...)); 
      com.Parameters.Add(new SQLiteParameter(...)); 
      com.CommandText = "Insert into ..."; 
      com.ExecuteNonQuery(); 
     } 
     } 
    } 
    } 
    trans.Commit();     
} 

을. 나는 SQLite 제공자가 어떻게 동작 할지는 모르지만 적어도 을 시도하여 원래 코드 당 SQLiteCommand을 만들고 매개 변수 을 추가했지만 값은이 아닌 것으로 생각합니다. ExecuteNonQuery 코드를 가장 안쪽의 foreach 루프에 추가합니다. 이런 식으로 뭔가가 :

using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction()) 
{ 
    using (SQLiteCommand com = new SQLiteCommand(DataAccess.ConnectionManager)) 
    { 
    com.CommandText = "Insert into ..."; 
    SQLiteParameter p1 = com.Parameters.Add(new SQLiteParameter(...)); 
    SQLiteParameter p2 = com.Parameters.Add(new SQLiteParameter(...)); 
    SQLiteParameter p3 = com.Parameters.Add(new SQLiteParameter(...)); 
    foreach (var week in weekList) 
    { 
     p1.Value = week; 
     foreach (var day in week.Days) 
     { 
     p2.Value = day; 
     foreach (var period in day.Periods) 
     { 
      p3.Value = period;    
      com.ExecuteNonQuery(); 
     } 
     } 
    } 
    } 
    trans.Commit();     
} 

그냥 그 작동하는지 모르겠어요, 반복합니다 -하지만 난 희망는 것을 것입니다.

+0

[+1 할 수 있으면!] (http://meta.stackexchange.com/questions/5212/) – Timwi

+0

@Lisa : 잘못된 유형의 것으로 의심됩니다. 적절한 DbType을 사용하여 매개 변수를 생성 해보십시오. –

+0

네가 게시하기 전에 네가 해설 한 적이 있는데 내 코멘트를 삭제했다. HAHA가 다시 업데이트 된 것을 본다 : P OK 고마워, 존 잘 자러 갈 수있어;) – Elisabeth

관련 문제