【问题标题】:Dapper is throwing an invalid cast exception when trying to set a boolean value returned from MySQL尝试设置从 MySQL 返回的布尔值时,Dapper 抛出无效的强制转换异常
【发布时间】:2011-11-16 16:10:24
【问题描述】:

我有这门课

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

我正在使用 dapper 用这个 sql 填充它:

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

当我运行它时,我得到了这个错误:

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

我已经浏览了简洁的代码并且 sqldatareader 说该列是 int64,所以看起来 .NET Mysql 连接器认为“TRUE”(在 MYSQL 中应该是 tinyint)是一个 @ 987654325@.

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

我已经“解决”了这个问题,方法是将其全部选择到一个临时表中,其中IsValidated 列声明为BOOL,但这是一个糟糕的解决方案。

【问题讨论】:

  • 我一直对向下转换感到不舒服,你有丢失信息的风险。我们可能在 Dapper 中添加可扩展性挂钩,以便您可以定义向下转换规则……目前尚未决定
  • 但这不是低调吧? MySQL 正在返回一个 tinyint (TRUE)
  • System.Data.SQLite 也会出现这个问题。 Dapper 仅接受 INTEGER 数据类型作为映射到 Int64。

标签: mysql dapper mysql.data


【解决方案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); }
   }  
}  

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

cast(TRUE `IsValidated` as bit)

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

【讨论】:

    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-20
    相关资源
    最近更新 更多