使用dapper.net进行批量插入的最佳方法

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


Sud*_*hra 7

在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,但也可以适用于插入或更新.


Jon*_*nan 5

SqlBulkCopyAlex和Andreas建议,最好的免费插入方式是直接使用该类.

免责声明:我是Dapper Plus项目的所有者

该项目为以下操作提供了简便的支持:

  • BulkInsert
  • BulkUpdate
  • BulkDelete
  • BulkMerge

通过使用映射并允许输出像标识列一样的值.

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

  • 这里有一个带有批量插入的开源项目。这其实并没有那么难。https://github.com/KostovMartin/Dapper.Bulk (3认同)
  • @JonathanMagnan,不清楚 Dapper Plus 是否有免费版本,它与 Pro 版本有何不同? (2认同)
  • 是的,必须为生产购买产品。试用期在每个月底结束,因此您只需每月下载一次即可延长试用期,该试用版适用于所有非生产环境。 (2认同)
  • RE:DapperPlus - 一名开发人员的许可费起价为每年 799 美元。一名承包商在不知情的情况下使用 Dapper Plus 构建了一些软件。对于从 Nuget 获得它的人来说,没有办法知道这只是一个试用版,并且“免费和主要功能”的措辞具有误导性。没有免费功能。“功能:BulkInsert、BulkDelete、BulkUpdate、BulkMerge 等!支持:SQL Server、MySQL、Oracle、PostgreSQL、SQLite 等!在线示例:https://dotnetfiddle.net/ltIqrC 包括免费和主要功能。” (2认同)