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

C# 使用multi.Read时,输出参数始终为null,c#,dapper,C#,Dapper,我们正在广泛使用它,并且对此非常满意。但是,我们在尝试使用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

我们正在广泛使用它,并且对此非常满意。但是,我们在尝试使用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

}
var p=newdynamicParameters();
p、 添加(“@id”,id);
p、 添加(“TotalRows”,dbType:dbType.Int32,方向:ParameterDirection.Output);
使用(var multi=cnn.QueryMultiple(string.Format(“dbo.[{0}]”,spName),p,
commandType:commandType.StoredProcess)
{  
int TotalRows=p.Get(@TotalRows”);//此值始终为null
var results=multi.Read().ToList();
var areas=multi.Read().ToList();
var categories=multi.Read().ToList();
int TotalRows=multi.Read().FirstOrDefault();//这很有效
}
但是,如果我们使用connection.Query语法来获取单个结果集,则会填充输出参数:

var result = cnn.Query<New_Supplier>(string.Format("spname"), p,
    commandType: CommandType.StoredProcedure).ToList<New_Supplier>();
int TotalRows = p.Get<int>("@TotalRows");
var result=cnn.Query(string.Format(“spname”),p, commandType:commandType.StoredProcess.ToList(); int TotalRows=p.Get(“@TotalRows”); 错误在于Dapper DynamicParameters中输出参数上AttachedParam的sqlValue始终为空

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


为什么参数总是空的?

在TDS流中,
OUT
参数位于末尾。在您的
查询
示例中,您已经使用了TDS流:


如果这不起作用,让我知道;p

谢谢,马克,它很管用。我知道它必须是一些简单的东西,但就是看不见它……@Simon现在可能很明显,但我要补充的是:直接使用ADO.NET时,您会得到完全相同的行为。
var result = cnn.Query<New_Supplier>(string.Format("spname"), p,
    commandType: CommandType.StoredProcedure).ToList<New_Supplier>();
int TotalRows = p.Get<int>("@TotalRows");
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");