use*_*358 9 .net c# sql-server bulkinsert dapper
我使用以下代码将记录插入SQL Server 2014中的表
using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["myConnString"]))
{
conn.Execute("INSERT statement here", insertList);
}
Run Code Online (Sandbox Code Playgroud)
这insertList是一个包含100万个项目的列表.我在i5桌面上测试了这个插件,在同一台机器上向SQL Server插入了一百万条记录大约需要65分钟.我不确定dapper是如何在幕后进行插入的.我当然不想打开和关闭数百万次数据库连接!
这是在小巧玲珑中进行批量插入的最佳方式,还是应该尝试其他方法,或者使用企业库使用普通的ADO.Net?
编辑
事后看来,我知道使用ADO.Net会更好,所以将重新解释我的问题.我仍然想知道这是否是最适合小巧玲珑的人,或者我错过了一个更好的方法来在小巧玲珑本身做到这一点?
Ale*_*all 13
如果性能是您所追求的,那么我建议使用SqlBulkCopy而不是使用Dapper插入.请参阅此处以进行一些性能比较:http://www.ikriv.com/dev/db/SqlInsert/SqlInsert.html
在Ehsan Sajjad的注释的基础上,其中一种方法是编写一个存储过程,该过程具有用户定义的TABLE类型的READONLY参数.
假设您要批量插入包含名字和姓氏的联系人,您可以这样做:1)创建表格类型:
CREATE TYPE [dbo].[MyTableType] AS TABLE(
[FirstName] [varchar](50) NULL,
[LastName] [varchar](50) NULL
)
GO
Run Code Online (Sandbox Code Playgroud)
2)现在创建一个使用上述表类型的存储过程:
CREATE PROC [dbo].[YourProc]
/*other params here*/
@Names AS MyTableType READONLY
AS
/* proc body here
*/
GO
Run Code Online (Sandbox Code Playgroud)
3)在.NET端,将参数作为System.Data.SqlDbType.Structured传递.这通常涉及创建内存数据表,然后向其添加行,然后使用此DataTable对象作为@Names参数.注意:DataTable被认为是内存密集型 - 请小心并分析您的代码,以确保它不会导致服务器上的资源问题.
ALTENATIVE SOLUTION 使用此处概述的方法:https://stackoverflow.com/a/9947259/190476 该解决方案适用于DELETE,但也可以适用于插入或更新.
SqlBulkCopyAlex和Andreas建议,最好的免费插入方式是直接使用该类.
免责声明:我是Dapper Plus项目的所有者
该项目为以下操作提供了简便的支持:
通过使用映射并允许输出像标识列一样的值.
// CONFIGURE & MAP entity
DapperPlusManager.Entity<Order>()
.Table("Orders")
.Identity(x => x.ID);
// CHAIN & SAVE entity
connection.BulkInsert(orders)
.AlsoInsert(order => order.Items);
.Include(x => x.ThenMerge(order => order.Invoice)
.AlsoMerge(invoice => invoice.Items))
.AlsoMerge(x => x.ShippingAddress);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
35102 次 |
| 最近记录: |