Dapper: Impossible d'analyser les flottants (colonne d'analyse d'erreur)

asp.net-mvc dapper sql-server

Question

Je récupère des données à partir de SQL Server à partir d'une procédure stockée à l'aide de Dapper et je reçois une erreur

Specified cast is not valid.

et détails:

Error parsing column 4 (SubTotal=0.00 - Decimal)

Côté SQL Server, la colonne SubTotal est decimal(18, 2) NULLABLE et sur le côté .NET, elle est decimal? . Les données extraites sont 0.00 .

J'ai vérifié cette réponse: Dapper, décimal à doubler? Erreur d'analyse de la colonne X

Selon la réponse, j'ai remplacé

il.Emit(OpCodes.Ldtoken, unboxType);

avec

il.Emit(OpCodes.Ldtoken, Nullable.GetUnderlyingType(unboxType) ?? unboxType);

à la ligne 2360 et continue à recevoir la même erreur.

Quelqu'un a des idées à ce sujet? Merci.

Mise à jour :

J'ai essayé de rendre la colonne non nullable. Également essayé de changer de colonne pour float (sur SQL Server) et double (sur le côté .NET). Aucun de ceux-ci ne fonctionnait et je recevais la même erreur. Puis j'ai changé la colonne en int et maintenant le code fonctionne bien. Cependant, je travaille avec des valeurs monétaires et souhaite utiliser des nombres à virgule flottante. Va enquêter plus loin ...

J'exécute une procédure stockée comme suit

var transaction = this.db.Query<PaymentTransactions>("usp_PaymentTransactionsGetSingleIfPaid", new { registrationId }, commandType: CommandType.StoredProcedure);

La partie pertinente de la procédure stockée qui renvoie des informations est ci-dessous.

SELECT * FROM PaymentTransactions WHERE RegistrationId = @registrationId AND TransactionStatus = 'SUCCESS';

MISE À JOUR 2 :

Dapper fonctionne bien. Il y avait peut-être quelque chose qui n'allait pas dans mon environnement de développement. Il a suffi de redémarrer VS.

Réponse acceptée

Il semble que ce ne soit pas spécifique à Dapper, car je viens de vérifier que l'extrait ci-dessous fonctionne comme prévu.

Essayez d'énumérer explicitement vos noms de colonne (au lieu de select *) afin que la procédure renvoie exactement ce qui devrait être mappé à PaymentTransactions . Il est possible qu'il y ait une autre colonne non décimale mal nommée?

Cela utilise Dapper v1.13 sur .Net45:

Procédure:

create procedure dbo.Test
as
select  [SubTotal] = cast('0.01' as decimal(18,2)) 
union all 
select null;

Linqpad:

void Main()
{
    using (IDbConnection cnn = GetOpenConnection())
    {
        var users = cnn.Query<Sale>("yak.dbo.test", new { }, commandType: CommandType.StoredProcedure);
        users.Dump();

    }
}

public static readonly string connectionString = "Data Source=.;Initial Catalog=tempdb;Integrated Security=True";

public static IDbConnection GetOpenConnection()
{
  var connection = new SqlConnection(connectionString);
  connection.Open();
  return connection;
}

public class Sale
{
   public decimal? SubTotal;
}

Résultats:

entrer la description de l'image ici


Réponse populaire

Ne ris pas, mais j'ai eu exactement le même problème avec Dapper dans un projet ASP.NET MVC et la solution, comme dans le commentaire de @erdinger, a également fonctionné pour moi:

  • Fermer Visual Studio
  • Redémarrez Visual Studio

Le problème a été résolu de cette façon ...




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