Выполнить вставки SQLite в нескольких циклах foreach в C #? - PullRequest
1 голос
/ 22 августа 2010

это мой код, который у меня есть:

Я прочитал, что настройка 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();                
}

ОБНОВЛЕНИЕ: Решение, которое работает!

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();
            }
        }

1 Ответ

0 голосов
/ 22 августа 2010

Ну, вы можете просто переместить петли:

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();                
}

Просто повторюсь, я не знаю, сработает ли это, - но я бы надеюсь это сработало бы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...