Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中的几个foreach循环中执行SQLite插入?_C#_Sqlite_Insert_Foreach - Fatal编程技术网

在C#中的几个foreach循环中执行SQLite插入?

在C#中的几个foreach循环中执行SQLite插入?,c#,sqlite,insert,foreach,C#,Sqlite,Insert,Foreach,这是我的代码,我有: 我已经读到设置CommandText应该只发生一次,而不是在循环中。。。但是如何从foreach中获取单个项目的数据呢 有足够聪明的人重构代码,那就太好了:) 更新:有效的解决方案 using (SQLiteTransaction trans = DataAccess.ConnectionManager.BeginTransaction()) { using (SQLiteCommand com = new SQLit

这是我的代码,我有:

我已经读到设置CommandText应该只发生一次,而不是在循环中。。。但是如何从foreach中获取单个项目的数据呢

有足够聪明的人重构代码,那就太好了:)

更新:有效的解决方案

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

好吧,你可以移动这些循环:

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

我只是想重申一下,我不知道这是否行得通,但我希望行得通。

@Lisa:我怀疑它的类型不对。试着用合适的数据库类型创建参数。是的,在你发布这篇文章之前就做了,我删除了我的评论哈哈,再次更新:P好的,谢谢你,乔恩,现在我可以睡觉了,晚安;)是的,这是正确的方法!!使用参数化查询并将插入绑定到一个大型事务中,可以使Sqlite更快。是的,在不到一秒钟的时间内插入4000个插入,速度非常快:)在0488秒内插入40K行和5列,这甚至更疯狂哈哈。Sqlite非常快。
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();                
}