2010-08-21 58 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 2010-08-22 04:44:09

+0

是的,它是快速可怕的4000插入不到一個感覺第二:) – Elisabeth 2010-08-22 07:58:33

+0

它更加瘋狂在0,488秒插入40行5列哈哈。 Sqlite是瘋狂的快速。 – Elisabeth 2010-08-22 10:52:46

回答

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 2010-08-21 21:24:54

+0

@Lisa:我懷疑它是錯誤的類型。嘗試使用適當的DbType創建參數。 – 2010-08-21 21:57:09

+0

是的,只是之前,你發佈了這一點,我刪除了我的評論哈哈看到它再次更新:P 好吧謝謝喬恩現在我可以去睡覺晚安;) – Elisabeth 2010-08-21 21:58:48