C# Npco InsertBulk()花了45*分钟*插入20000条记录
我正在开发一个Winforms应用程序,目前使用DataTables/DataAdapters,重点是将删除的文本导入/处理到嵌入式SQL Server Compact数据库中 它可以工作,但我并不热衷于在我的应用程序中传递数据行,而不是POCO。我想我应该窥视一下ORMs的世界,以便进行比较。NPoco看起来不错,因为它明确支持sqlserver紧凑和简单语法。但是C# Npco InsertBulk()花了45*分钟*插入20000条记录,c#,winforms,bulkinsert,npoco,C#,Winforms,Bulkinsert,Npoco,我正在开发一个Winforms应用程序,目前使用DataTables/DataAdapters,重点是将删除的文本导入/处理到嵌入式SQL Server Compact数据库中 它可以工作,但我并不热衷于在我的应用程序中传递数据行,而不是POCO。我想我应该窥视一下ORMs的世界,以便进行比较。NPoco看起来不错,因为它明确支持sqlserver紧凑和简单语法。但是 List<dummy> many = new List<dummy>(20000);
List<dummy> many = new List<dummy>(20000);
for (int i = 0; i < 20000; i++)
{
dummy newdummy = new dummy();
newdummy.dummytext = $"many-{i}";
many.Add(newdummy);
}
using (Database db = new Database(CONNECTIONSTRING, DatabaseType.SQLCe))
{
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
db.InsertBulk(many);
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
}
List many=新列表(20000);
对于(int i=0;i<20000;i++)
{
dummy newdummy=新dummy();
newdummy.dummytext=$“许多-{i}”;
many.Add(newdummy);
}
使用(Database db=new数据库(CONNECTIONSTRING,DatabaseType.SQLCe))
{
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
db.InsertBulk(多个);
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
}
我被它的速度所震惊!45分钟的挂钟时间。(结果20000条记录的提取时间可以接受,但仍然…)
为了进行比较,我可以用一个准备好的命令导入20000多条记录&在大约2.5秒内更新循环中的参数值。数据适配器。更新时间为8秒
是ORM不适合我的用例,还是我应该尝试另一种ORM,或者……?Per@John,这个问题的解决方法是在事务中包装批量插入
using (Database db = new Database(CONNECTIONSTRING, DatabaseType.SQLCe))
{
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
db.BeginTransaction(); // <------
db.InsertBulk(many);
db.CompleteTransaction(); // <------
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
}
使用(Database db=new数据库(CONNECTIONSTRING,DatabaseType.SQLCe))
{
System.Diagnostics.Debug.Print(DateTime.Now.ToString());
db.BeginTransaction();//您可以使用orm,但它需要明确支持批量操作。实体框架可以在其他库的帮助下使用。在内部,NPoco使用SqlBulkCopy。您的问题不在于库:sqlce不支持批量操作。遗憾的是,NPoco上唯一真正的批量插入实现是针对SqlServer的。甚至它也不支持批量操作以最佳方式实施-首先将POCO转换为…数据表:(对ORM没有意见,但如果您正在寻找一种快速批量插入SqlCE db的方法,那么请使用CommandType.TableDirect.SqlCE支持事务吗?您可以对事务进行相同的测试吗?@John:db.BeginTransaction();db.InsertBulk(多个);db.CompleteTransaction()
把时间缩短到4秒。我想我可以接受。@TnTinMn的建议是不到1秒。