如何使用精巧的orm执行批量操作?

时间:2013-07-02 10:03:17

标签: orm batch-file dapper bulk

我在项目中有一个dapper orm,我已经在数据库中保存了数据(1200000row),但是在与dapper的事务中,我想要fast.with nhibernate(session statetless)很慢。 我认为短小精悍是快速的,因为获取数据(700000)与nhibernate在33秒,与9秒的精巧。

如何解决问题?

我的代码是:

IDbTransaction trans = connection.BeginTransaction();
connection.Execute(@"
    insert DailyResult(Id, PersonId,DateTaradod,DailyTaradods)
    values(@Id, @PersonId,@DateTaradod,@DailyTaradods)", entity, trans);                                    
trans.Commit();

1 个答案:

答案 0 :(得分:5)

没有机制可以通过任何常规ADO.NET API在事务即时中插入1200000行。只是不是那个API的意图

对于你想要的,听起来你应该使用SqlBulkCopy。这支持交易,您可以使用FastMember来提供帮助;例如:

IEnumerable<YourEntity> source = ...
using(var bcp = new SqlBulkCopy(
    connection, SqlBulkCopyOptions.UseInternalTransaction))
using(var reader = ObjectReader.Create(source,
         "Id", "PersonId", "DateTaradod", "DailyTaradods"))
{
    bcp.DestinationTableName = "DailyResult";
    bcp.WriteToServer(reader);
}

它还支持外部事务,但如果您要“创建tran,push,commit tran”,您也可以使用内部事务。

如果您不想使用SqlBulkCopy,您还可以查看表值参数方法,但在处理时SqlBulkCopy将是我的推荐 API这卷。

注意:如果表的列数多于IdPersonIdDateTaradodDailyTaradods,则可以指定显式bcp.ColumnMappings来调整插入方式的行为。