Dapper lance une exception de conversion invalide lors de la tentative de définition d'une valeur booléenne renvoyée par MySQL

dapper mysql mysql.data

Question

J'ai cette classe

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public bool IsValidated { get; set; }
}

Et je le remplis avec ce SQL en utilisant dapper:

var users = connection.Query<User>("SELECT userId, userName, TRUE `IsValidated` FROM user WHERE [...]").ToList();

Quand je lance ceci je reçois cette erreur:

Erreur d'analyse de la colonne 2 (IsValidated = 1 - Int64)

J'ai parcouru le code dapper et le sqldatareader dit que cette colonne est int64 , donc il semble que le connecteur .NET Mysql pense que 'TRUE' (qui devrait être tinyint dans MYSQL) est un int64 .

J'ai trouvé ce rapport de bogue qui disait que pour toutes les versions d'INT (INT, BIGINT, TINYINT, SMALLINT, MEDIUMINT), le connecteur .NET renvoyait int64. Cependant, c'était un bug dans MySQL 5.0 et a été corrigé, j'utilise 5.5. J'ai mysql.data version 6.4.3.0

J'ai "résolu" ce problème en le sélectionnant dans une table temporaire avec la colonne IsValidated déclarée en tant que BOOL , mais c'est une solution moche.

Réponse populaire

Je ne suis pas familier avec Drapper, mais comme MySQL renverra n'importe quel booléen en tant que int (normalement tinyint), une option pourrait être de changer votre classe comme suit:

public class User  
{  
    public int UserId { get; set; }  
    public string UserName { get; set; }
    private bool _isValidated = false;
    public bool IsValidated
    { 
        get{ return _isValidated;}
        set{ _isValidated = Boolean.Parse(value); }
   }  
}  

Sinon, essayez un casting dans le sql

cast(TRUE `IsValidated` as bit)

Je n'ai pas essayé ceci, mais au moins vous avez une suggestion. Bonne chance.




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