Dapper генерирует недопустимое исключение приведения при попытке установить логическое значение, возвращаемое из MySQL - PullRequest
11 голосов
/ 14 сентября 2011

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

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)

Я прошел через щадящий код, и 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, но это паршивое решение.

1 Ответ

1 голос
/ 15 апреля 2012

Я не знаком с Drapper, но поскольку MySQL будет возвращать любое логическое значение в виде целого числа (обычно 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)

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

...