Подтвердить что ты не робот

Dapper бросает недопустимое исключение литых при попытке установить логическое значение, возвращаемое из MySQL

У меня этот класс

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

И я заполняю его этим sql, используя dapper:

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

Когда я запускаю это, я получаю эту ошибку:

Анализ синтаксического анализа столбца 2 (IsValidated = 1 - Int64)

Я прошел через код dapper, и sqldatareader говорит, что этот столбец int64, поэтому он выглядит так:.NET Mysql Connector думает, что 'TRUE' (который должен быть tinyint в MYSQL) является int64.

Я нашел этот отчет об ошибках, в котором говорилось, что для всех версий INT (INT, BIGINT, TINYINT, SMALLINT, MEDIUMINT) соединитель .NET возвращал int64. Однако это была ошибка в MySQL 5.0 и была исправлена, я использую 5.5. У меня есть mysql.data версия 6.4.3.0

Я решил эту проблему, выбрав все это во временную таблицу с столбцом IsValidated, объявленным как BOOL, но это паршивое решение.

4b9b3361

Ответ 1

Я не знаком с Drapper, но поскольку MySQL вернет любое значение boolean как int (обычно tinyint), один из вариантов может состоять в том, чтобы изменить ваш класс на следующее:

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); }
   }  
}  

Альтернативно попробуйте листинг в sql

cast(TRUE `IsValidated` as bit)

Я не пробовал это, но, по крайней мере, у вас есть предложение. Все лучшее.