使用Dapper执行多个存储过程而无需将其映射到对象

4
使用Dapper,我可以批量执行存储过程,类似于以下操作:
connection.Execute(@"
  exec sp1 @i = @one, @y = @two 
  exec sp2 @i = @three",
  new { one = 1, two = 2, three = 3 });

然而,到目前为止我看到的唯一检索数据的方法是使用

results.Read<Type>()

如果结果没有映射到对象怎么办?例如,我正在编写“通用”代码以执行任何带有可变输入/输出参数和结果集的SP。
谢谢
1个回答

3
你需要哪个API?如果你可以分别处理网格,请这样做:
using(var multi = connection.QueryMultiple(...))
{
    while(!multi.IsConsumed) {
        // ...
    }
}

其中 ... 可以访问:

  • Read() 用于动态行 - 注意每行也实现了 IDictionary<string,object>
  • Read<T>() 可以通过泛型读取类型化的行
  • Read(Type) 可以读取没有泛型的类型化行
  • Read<DapperRow>() (实际上,这只是 Read<T>() 使用来实现 Read()T,但更方便), 它提供了稍微更多的元数据访问权限

如果您想要降到原始的 IDataReader,可以这样做:

using(var reader = connection.ExecuteReader(...)) {
    // whatever you want
}

关于参数: DynamicParameters 类提供了更丰富的参数控制,包括参数方向等。

那么每个 .Read() 返回的结果都是按照 "exec" 发送的顺序返回的单个网格,对吗?另外,当你说 .ExecuteReader 时,这是 Dapper 提供的扩展方法,类似于 ADO.NET 中的 DataReader,提供原始访问权限?最后一个问题,DP 可以与 QueryMultiple 和 ExecuteReader 一起使用吗?顺便说一下,我在 Pluralsight 上观看了关于 Dapper 的视频,看起来非常不错。 - Bill
"是的"(好吧,实际上它是按照执行的select顺序进行的 - 它看不到更多的内容),"是的"和"是的"。 - Marc Gravell
还有一个问题,如果我正在使用QueryMultiple和DynamicParameters,我可以将SQL作为多个存储过程调用传递,由“;”分隔,然后提供一个单独的DynamicParameter对象,其中包含所有SP的所有参数吗?谢谢。 - Bill
我完成了一个小组件,可以接收任意数量带有输入参数的存储过程,并执行它们。Dapper目前运行良好。 - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接