读完这篇文章之后,我决定仔细看看我使用Dapper的方式。 我在一个空的数据库上运行这个代码 var members = new List<Member>(); for (int i = 0; i < 50000; i++) { members.Add(new Member() { Username = i.toString(), IsActive = true }); } using (var scope = new TransactionScope()) { connection.Execute(@" insert Member(Username, IsActive) values(@Username, @IsActive)", members); scope.Complete(); } 花了大约20秒。 这是2500插入/秒。 不错,但不是很好,或者考虑到博客是实现45k插入/秒。 在Dapper中有更有效的方法吗? 此外,作为一个方面说明,通过Visual Studiodebugging器运行此代码需要3分钟! 我觉得debugging器会稍微减慢一点,但我真的很惊讶,看到这么多。 UPDATE 所以这 using (var […]
我正在使用SqlBulkCopy对象将几百万生成的行插入到数据库中。 唯一的问题是我插入的表有一个标识列。 我已经尝试将SqlBulkCopyOptions设置为SqlBulkCopyOptions ,并将标识列设置为0 , DbNull.Value和null 。 这些都没有工作。 我觉得我错过了一些非常简单的事情,如果有人能够启发我,这将是太棒了。 谢谢! 编辑为了澄清,我没有在我导入的DataTable设置的身份值。 我希望将它们作为导入的一部分生成。 编辑2这里是我用来创build基SqlBulkCopy对象的代码。 SqlBulkCopy sbc = GetBulkCopy(SqlBulkCopyOptions.KeepIdentity); sbc.DestinationTableName = LOOKUP_TABLE; private static SqlBulkCopy GetBulkCopy(SqlBulkCopyOptions options = SqlBulkCopyOptions.Default) { Configuration cfg = WebConfigurationManager.OpenWebConfiguration("/RSWifi"); string connString = cfg.ConnectionStrings.ConnectionStrings["WifiData"].ConnectionString; return new SqlBulkCopy(connString, options); }
我有一个有100万个元素的List<MyObject> 。 (它实际上是一个SubSonic集合,但不从数据库加载)。 我目前正在使用SqlBulkCopy如下: private string FastInsertCollection(string tableName, DataTable tableData) { string sqlConn = ConfigurationManager.ConnectionStrings[SubSonicConfig.DefaultDataProvider.ConnectionStringName].ConnectionString; using (SqlBulkCopy s = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.TableLock)) { s.DestinationTableName = tableName; s.BatchSize = 5000; s.WriteToServer(tableData); s.BulkCopyTimeout = SprocTimeout; s.Close(); } return sqlConn; } 我使用SubSonic的MyObjectCollection.ToDataTable()从我的集合构buildDataTable。 但是,这会在内存中复制对象,效率低下。 我想使用SqlBulkCopy.WriteToServer方法使用IDataReader而不是DataTable,这样我就不会在内存中复制我的集合。 从列表中获取IDataReader的最简单方法是什么? 我想我可以实现一个自定义的数据阅读器(如这里http://blogs.microsoft.co.il/blogs/aviwortzel/archive/2008/05/06/implementing-sqlbulkcopy-in-linq-to-sql.aspx ) ,但是必须有一些简单的东西,我可以在不编写一堆generics代码的情况下做。 编辑:似乎没有人可以轻松地从一组对象中生成一个IDataReader。 接受当前的答案,即使我希望框架内置的东西。