Le paramètre de sortie est toujours nul avec multi.Read

c# dapper

Question

Nous utilisons beaucoup Dapper.Net et nous en sommes très satisfaits. Cependant, nous avons rencontré un problème lors de la tentative d'extraction des paramètres de sortie des procédures stockées à l'aide de 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

}

Cependant, si nous utilisons la syntaxe connection.Query pour obtenir un jeu de résultats unique, le paramètre de sortie est renseigné:

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

L'erreur est que sqlValue de AttachedParam sur le paramètre de sortie dans Dapper DynamicParameters est toujours nul.

Pour contourner ce problème, nous avons ajouté la valeur du paramètre de sortie aux ensembles de résultats de la procédure stockée et nous le lisons de cette manière.

Pourquoi le paramètre est-il toujours nul?

Réponse acceptée

Dans un flux TDS, les paramètres OUT sont à la fin . Dans votre exemple de Query<T> , vous avez consommé le flux TDS :

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

donc, comme vous avez consommé le flux, les nouvelles valeurs de paramètre ont été atteintes et vous devriez avoir les valeurs disponibles. Dans l'exemple QueryMultiple , vous n'avez pas atteint la fin du flux TDS. Essayez de déplacer le 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 cela ne fonctionne pas, faites le moi savoir p




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi