EF6 + SQL 14:将大量行上传到表中的最有效方法

时间:2016-07-25 15:30:46

标签: sql-server entity-framework ado.net

使用Entity Framework 6和SQL Server 2014:

我需要将XML文件中的~200,000行上传到SQL Server表中。每行中有5个字段。连续数据不大,但我有很多行。

在y C#应用程序中,我可以解析XML文件并在内存中读取它的数据没问题。但我担心每行向SQL Server发送一个TSQL存储过程调用效率不高。在EF6中实现此要求的最有效方法是什么?

如果Entity Framework不适合这个,我可以直接使用ADO.NET。

3 个答案:

答案 0 :(得分:1)

您可以将多行打包到DataTable中,并作为表值参数(tvp)传递给您的存储过程。您的存储过程可以使用tvp作为源或连接到tvp的INSERT语句来执行MERGE语句。

使用直接ADO.NET可以很好地工作。从快速谷歌,它看起来也应该通过实体框架。例如:http://www.c-sharpcorner.com/UploadFile/78607b/using-table-valued-parameters-in-entity-framework

与tvps相关的一些链接:

http://www.sommarskog.se/arrays-in-sql-2008.html

http://www.sommarskog.se/arrays-in-sql-perftest-2009.html

答案 1 :(得分:0)

尝试使用OPENROWSET并直接解析:

DECLARE @xml XML
SELECT @xml = BulkColumn
FROM OPENROWSET(BULK 'D:\sample.xml', SINGLE_BLOB) x

SELECT t.c.value('.', 'NVARCHAR(100)')
FROM @xml.nodes('root/row') t(c)
GO

答案 2 :(得分:0)

通过在添加实体并在调用SaveChanges之前再次打开实例时设置context.AutoDetectChangesEnabled = false,可以从实体框架中获得明显更好的性能。小批量添加实体并每次处理上下文也有帮助。

或者,有一些第三方库可以做得更好:

EntityFramework.BulkInsert

Entity Framework Extensions

Entity Framework Plus

后两者是商业广告,我相信Entity Framework Plus是Entity Framework Extensions的演变。