El parámetro de salida siempre es nulo con multi.Leer

c# dapper

Pregunta

Estamos utilizando Dapper.Net extensivamente y estamos muy contentos con él. Sin embargo, hemos encontrado un problema al tratar de recuperar los parámetros de salida de los procedimientos almacenados utilizando 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

}

Sin embargo, si utilizamos la sintaxis connection.Query para obtener un solo conjunto de resultados, el parámetro de salida se llena:

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

El error es que sqlValue de AttachedParam en el parámetro de salida en Dapper DynamicParameters siempre es nulo.

Para solucionar esto, hemos agregado el valor del parámetro de salida a los conjuntos de resultados del procedimiento almacenado y lo estamos leyendo de esa manera.

¿Por qué el parámetro siempre es nulo?

Respuesta aceptada

En un flujo TDS, los parámetros OUT están al final . En su ejemplo de Query<T> , ha consumido la secuencia de TDS :

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

por lo tanto, debido a que ha consumido la secuencia, se han alcanzado los nuevos valores de parámetro y debe tener los valores disponibles. En el ejemplo de QueryMultiple , no ha llegado al final de la secuencia de TDS. Intenta mover la 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");

Si eso no funciona, házmelo saber; p



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow