在尝试设置从MySQL返回的布尔值时,Dapper会抛出无效的强制转换异常

Gle*_*ven 11 mysql mysql.data dapper

我有这门课

public class User
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public bool IsValidated { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我用dapper用这个sql填充它:

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

当我运行这个时,我收到此错误:

解析第2列时出错(IsValidated = 1 - Int64)

我已经通过短小精悍代码阶梯状SqlDataReader的是说,该列int64,所以它看起来像.NET MySQL连接被认为"TRUE"(应该在MYSQL被TINYINT)是int64.

我确实找到了这个错误报告,该报告说对于所有版本的INT(INT,BIGINT,TINYINT,SMALLINT,MEDIUMINT),.NET连接器返回int64.然而,这是MySQL 5.0中的一个错误并且已修复,我使用的是5.5.我有mysql.data版本6.4.3.0

我已经"解决"了这个问题,将它全部选择到一个临时表中,并将IsValidated列声明为BOOL,但这是一个糟糕的解决方案.

jor*_*are 1

我不熟悉 Drapper,但由于 MySQL 会将任何布尔值作为 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); }
   }  
}  
Run Code Online (Sandbox Code Playgroud)

或者尝试在 sql 中进行强制转换

cast(TRUE `IsValidated` as bit)
Run Code Online (Sandbox Code Playgroud)

我没有尝试过,但至少你有一个建议。一切顺利。