Tinyint映射为C#中的布尔字段

时间:2016-03-30 08:28:03

标签: c# mysql dapper

我试图映射' tinyint'用'布尔'领域,但它给我下面的问题。这个问题只与本地数据库一起使用,实时数据库工作正常。我不明白问题在哪里,可能是它的地区问题。我正在使用dapper进行映射。  如果您有任何想法,请帮助我,下面是复制例外。

  

类型' System.Data.DataException'的第一次机会异常。发生了   在DAL.dll中其他信息:解析第15列时出错(IsBold = 1 -   为SByte)。

3 个答案:

答案 0 :(得分:1)

嗯,这听起来像个臭虫。我们处理了许多类似的转换。

原始IL(使用OpCodes.Conv_Ovf_I4)在本地测试中正常工作;我在这里有点受阻,因为我本地没有mysql,而且我的所有服务器都有:只有unsigned tinyint。这里有任何内部异常,或者我可以使用的其他东西吗?但是:这可能是github issues list的一个问题。

答案 1 :(得分:0)

您可以快速扩展数据类型tinyint,如下所示:

public static class IntExtensions
{
   public static bool AsBool(this int value)
  {
     return value != 0;
  }
}

然后您可以在代码中的任何位置使用它:

IsBold == 1.AsBool()

答案 2 :(得分:0)

我已经安装了MySql社区版(@@version报告5.7.11-log)。以下在1.50-beta9上工作正常。

[FactMySql]
public void SO36303462_Tinyint_Bools()
{
    using (var conn = GetMySqlConnection(true, true, true))
    {
        try { conn.Execute("drop table SO36303462_Test"); } catch { }
        conn.Execute("create table SO36303462_Test (Id int not null, IsBold tinyint not null);");
        conn.Execute("insert SO36303462_Test (Id, IsBold) values (1,1);");
        conn.Execute("insert SO36303462_Test (Id, IsBold) values (2,0);");
        conn.Execute("insert SO36303462_Test (Id, IsBold) values (3,1);");

        var rows = conn.Query<SO36303462>("select * from SO36303462_Test").ToDictionary(x => x.Id);
        rows.Count.IsEqualTo(3);
        rows[1].IsBold.IsTrue();
        rows[2].IsBold.IsFalse();
        rows[3].IsBold.IsTrue();
    }
}
class SO36303462
{
    public int Id { get; set; }
    public bool IsBold { get; set; }
}

请尝试1.50-beta9。如果这不能解决问题,请帮助我重现失败的测试。