Utiliser les décimales avec une précision spécifique comme paramètres de sortie avec Dapper

c# dapper

Question

J'évalue Dapper en remplacement du code personnalisé et encombrant et jusqu'à présent, tout était très bon et prometteur. Mais ce matin, je suis tombé sur un problème avec les paramètres dynamiques et je ne trouve pas de solution.

Une procédure stockée calcule le solde du compte et le solde disponible pour un client renvoyant son résultat dans deux paramètres de sortie décimaux. Ces décimales sont déclarées dans la procédure stockée avec Precision = 18 et Scale = 2. Cette procédure fonctionne parfaitement avec les méthodes standard actuelles. Mais dans Dapper, je n'arrive pas à trouver un moyen de passer ces paramètres et à spécifier l'échelle. Tout ce que je récupère est la partie entière de la valeur décimale.

using (IDbConnection connection = OpenConnection())
{
    var args = new DynamicParameters(new { custID = customerID});

    // No way to set the scale here?
    args.Add("@accnt", dbType: DbType.Decimal, direction: ParameterDirection.Output);
    args.Add("@avail", dbType: DbType.Decimal, direction: ParameterDirection.Output);

    var results = connection.QueryMultiple("Customer_CalcBalance", args, commandType:CommandType.StoredProcedure);
    decimal account = args.Get<decimal>("@accnt");
    decimal availab = args.Get<decimal>("@avail");
}

Et voici la (les) question (s), il y a un moyen de passer l'échelle pour un paramètre de sortie décimal? Ou existe-t-il une autre façon d’atteindre mon objectif de récupérer les valeurs décimales exactes?

Réponse acceptée

Eh bien, il semble qu'il n'y ait aucun moyen de résoudre ce problème (au moins, personne n'a trouvé de réponse provisoire), alors j'ai mis cette solution de contournement que j'ai implémentée pour continuer avec le reste du travail.

var args = new DynamicParameters(new { custID = customerID});
args.Add("@accnt", dbType: DbType.Single, direction: ParameterDirection.Output);
args.Add("@avail", dbType: DbType.Single, direction: ParameterDirection.Output);

var results = connection.QueryMultiple("Customer_CalcBalance", args, commandType:CommandType.StoredProcedure);
decimal account = args.Get<decimal>("@accnt");
decimal availab = args.Get<decimal>("@avail");

J'ai passé les paramètres de sortie en tant que Single au lieu du type Decimal attendu.
De cette façon, je suppose que la propriété SqlParameter.Scale est définie sur quelque chose de différent de zéro et je pourrais obtenir les chiffres décimaux lorsque j'essaie de lire les paramètres de sortie.
Si quelqu'un a une meilleure solution, faites le moi savoir.


Réponse populaire

Un peu tard pour la fête, mais je pensais mentionner que cela avait été corrigé en 2015. Voici le problème de GitHub. Exemple d'utilisation:

public void Issue261_Decimals()
{
    var parameters = new DynamicParameters();
    parameters.Add("c", dbType: DbType.Decimal, direction: ParameterDirection.Output, precision: 10, scale: 5);
    connection.Execute("create proc #Issue261 @c decimal(10,5) OUTPUT as begin set @c=11.884 end");
    connection.Execute("#Issue261", parameters, commandType: CommandType.StoredProcedure);
    var c = parameters.Get<Decimal>("c");
    c.IsEqualTo(11.884M);
}


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