我想用Dapper批量调用存储过程。每次调用都会返回一组不同的结果,因此我使用的是QueryMultiple。如果我创建这样的参数:
var parameters = new DynamicParameters();
// The stored proc accepts a single integer, but I want to pass multiple so each call had a new value.
parameters.Add("LookupID", lookupIds);
var resultSet = connection.QueryMultiple("SPName", parameters, commandType: System.Data.CommandType.StoredProcedure);
我收到一条错误,指出存储过程指定了太多参数。那么我怎么能做到这一点呢?
答案 0 :(得分:1)
QueryMultiple
是关于结果,而不是输入。要做你想做的事,你需要多次调用SP。你可以通过一个简单的foreach
循环自己做,或者很多(不是全部)dapper方法可以通过传入IEnumerable<T>
作为最外面的对象来实现方便,例如:
int[] ids = ...
var args = ids.Select(id => new { id, val = "ABC" });
db.Execute("whatever", args);
对于每个项目传入@id
和@val
的每个项目将执行一次SQL。对于async
API,这也可以与MARS结合使用以消除调用之间的延迟成本,但这是选择加入,因为MARS不是默认选项。
或者,您可以编写一个新的包装器SP,它接受一个参数并将其拆分(新的string_split
将是理想的),并在服务器上执行循环。