使用multi.Read,输出参数始终为null

Sim*_*mon 5 c# dapper

我们广泛使用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

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我们使用connection.Query语法来获取单个结果集,则会填充输出参数:

var result = cnn.Query<New_Supplier>(string.Format("spname"), p,
    commandType: CommandType.StoredProcedure).ToList<New_Supplier>();
int TotalRows = p.Get<int>("@TotalRows");
Run Code Online (Sandbox Code Playgroud)

错误是Dapper DynamicParameters中输出参数的AttachedParam的sqlValue始终为null.

为了解决这个问题,我们将输出参数的值添加到存储过程的结果集中,并以这种方式读取它.

为什么参数总是为空?

Mar*_*ell 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");
Run Code Online (Sandbox Code Playgroud)

因为您已经使用了流,所以已经达到了新的参数值,并且您应该具有可用的值.在该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");
Run Code Online (Sandbox Code Playgroud)

如果不起作用,请告诉我; p

  • @Simon现在可能很明显,但只是添加:直接使用ADO.NET时会得到完全相同的行为. (2认同)