我们广泛使用Dapper.Net并对此非常满意。但是,在尝试使用 multi.Read 从存储过程检索输出参数时遇到了问题:
var p = new DynamicParameters();
p.Add("@id", id);
p.Add("TotalRows", dbType: DbType.Int32, direction: ParameterDirection.Output);
using (var multi = cnn.QueryMultiple(string.Format("dbo.[{0}]", spName), p,
commandType: CommandType.StoredProcedure))
{
int TotalRows = p.Get<int>("@TotalRows"); //This is always null
var results = multi.Read<New_Supplier>().ToList<IDBSupplier>();
var areas = multi.Read<node>().ToList<IDBNode>();
var categories = multi.Read<node>().ToList<IDBNode>();
int TotalRows = multi.Read<int>().FirstOrDefault(); // This works
}
但是,如果我们使用 connection.Query 语法来获取单个结果集,则会填充输出参数:
var result = cnn.Query<New_Supplier>(string.Format("spname"), p,
commandType: CommandType.StoredProcedure).ToList<New_Supplier>();
int TotalRows = p.Get<int>("@TotalRows");
错误是Dapper DynamicParameters中输出参数的AttachedParam的sqlValue始终为null。
要解决此问题,我们已将输出参数的值添加到存储过程的结果集中,并以此方式读取它。
为什么参数总是为空?
答案 0 :(得分:7)
在TDS流中,OUT
参数最后是 。在您的Query<T>
示例中,您已经使用了TDS流:
var result = cnn.Query<New_Supplier>(string.Format("spname"), p,
commandType: CommandType.StoredProcedure).ToList<New_Supplier>();
int TotalRows = p.Get<int>("@TotalRows");
因为您已经使用了流,所以已经达到了新的参数值,并且您应该具有可用的值。在QueryMultiple
示例中,您没有到达TDS流的末尾。尝试移动p.Get
:
var p = new DynamicParameters();
p.Add("@id", id);
p.Add("TotalRows", dbType: DbType.Int32, direction: ParameterDirection.Output);
using (var multi = cnn.QueryMultiple(string.Format("dbo.[{0}]", spName), p,
commandType: CommandType.StoredProcedure))
{
var results = multi.Read<New_Supplier>().ToList<IDBSupplier>();
var areas = multi.Read<node>().ToList<IDBNode>();
var categories = multi.Read<node>().ToList<IDBNode>();
}
int TotalRows = p.Get<int>("@TotalRows");
如果 不起作用,请告诉我们; p