mysql bit转bool失败_dapper 可空bool转换出错及解决方案

最近使用entityframewok生成数据库,使用dapper来访问数据库,产生了一个意外的bug,下面是产生bug的示例以及解决方案。

由于用entityframework生成数据库,默认情况entityframewok 将bool?转换为tinyint(1),

使用dapper查询数据时报错(部分数据为空,部分数据不为空,且查询出来的第一条是可为空的数据才会出现问题,否则不会报错)。

1、定义一个类:

public class BugNullable

{

public int ID { get; set; }

public string Name { get; set; }

public bool? IsBug { get; set; }

public DateTime? UpdatedTime { get; set; }

}

2、生成数据库表

CREATE TABLE `bugnullable` (

`ID` INT(11) NOT NULL AUTO_INCREMENT,

`Name` VARCHAR(50) NOT NULL DEFAULT ‘0‘,

`IsBug` TINYINT(1) NULL DEFAULT NULL,

`UpdatedTime` TIMESTAMP NULL DEFAULT NULL,

PRIMARY KEY (`ID`)

)

COLLATE=‘utf8_general_ci‘

ENGINE=InnoDB

AUTO_INCREMENT=3

;

3、填充数据

INSERT INTO `bugnullable` (`ID`, `Name`, `IsBug`, `UpdatedTime`) VALUES

(1, ‘test‘, NULL, NULL),

(2, ‘test1‘, 1, ‘2017-01-14 10:05:15‘);

4、dapper .net 测试代码

class Program

{

static void Main(string[] args)

{

///

/// 数据库连接串

///

var connectionString = ConfigurationManager.AppSettings["DefaultConnection"].Trim();

using (var conn = new MySqlConnection(connectionString))

{

//var bugs = conn.Query("select * from BugNullable order by ID asc;").ToList(); no bug

SqlMapper.GridReader gr = conn.QueryMultiple("select * from BugNullable order by ID asc;");//bug

var bugs = gr.Read().ToList();

bugs.ForEach(h => {

Console.WriteLine($"ID:{h.ID},Name:{h.Name},IsBug:{h.IsBug},UpdatedTime:{h.UpdatedTime}");

});

conn.Close();

}

Console.ReadLine();

}

}

public class BugNullable

{

public int ID { get; set; }

public string Name { get; set; }

public bool? IsBug { get; set; }

public DateTime? UpdatedTime { get; set; }

}

5、结果

+YJEZ0AAAAASUVORK5CYII=

6、解决方案:修改数据库字段大小(将bool对应的tinyint(1)适当扩大,如tinyint(2)或者bit(1))。

原文:http://www.cnblogs.com/wangchaozhi/p/6284957.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值