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