Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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# Npco InsertBulk()花了45*分钟*插入20000条记录_C#_Winforms_Bulkinsert_Npoco - Fatal编程技术网

C# Npco InsertBulk()花了45*分钟*插入20000条记录

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

我正在开发一个Winforms应用程序,目前使用DataTables/DataAdapters,重点是将删除的文本导入/处理到嵌入式SQL Server Compact数据库中

它可以工作,但我并不热衷于在我的应用程序中传递数据行,而不是POCO。我想我应该窥视一下ORMs的世界,以便进行比较。NPoco看起来不错,因为它明确支持sqlserver紧凑和简单语法。但是

        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秒。