Dapper可以批处理一组存储的proc调用吗?我在文档中看到它支持多个结果,但是我不确定是否可以使用Dapper执行多个存储的proc调用。

最佳答案

Dapper支持存储过程的批处理命令:

connection.Execute("create table #t (i int)");
connection.Execute("create proc #spInsert @i int as insert #t values (@i)");
connection.Execute("#spInsert", new[] { new { i = 1 }, new {i = 2}, new {i = 3} },
    commandType: CommandType.StoredProcedure);

var nums = connection.Query<int>("select * from #t order by i").ToList();

nums[0].IsEqualTo(1);
nums[1].IsEqualTo(2);
nums[2].IsEqualTo(3);

上面的代码将IDbCommand和文本#spInsert重复使用了3次。这使批处理插入更加有效。

通常,如果您担心此级别的性能,可以将批处理调用包装在事务中。

此外,Dapper支持您决定发送的任何批处理:
connection.Execute(@"
    exec #spInsert @i = @one
    exec #spInsert @i = @two
    exec #spInsert @i = @three",
    new { one = 1, two = 2, three = 3 });

这将导致插入三行。

此外,如果#spInsert返回了结果集,则可以使用QueryMultiple执行批处理,这将给您3个记录集进行迭代。

10-07 20:10