Dapper将数据库BIT类型映射为.NET bool类型,依赖DbType/SqlDbType识别和ReadBool逻辑;MySQL旧驱动返回UInt64需兼容修复,SQL Server需用bool?处理NULL,亦可注册自定义TypeHandler统一多库行为。

Dapper 对数据库 BIT 类型的处理,核心在于将数据库的位值(0/1)映射为 .NET 的 bool 类型。这个过程看似简单,但在不同数据库(如 SQL Server、MySQL、Oracle)中容易出问题,尤其当底层驱动返回类型不一致时。
BIT 类型映射的基本逻辑
Dapper 默认通过内置的类型映射表识别 BIT 列,并尝试转成 bool。它依赖两个关键机制:
- 查询结果列的
DbType或SqlDbType信息 - 目标属性是否为
bool或bool? - 若匹配,则调用内部
ReadBool()逻辑进行转换
例如这条测试代码验证了基础行为:
Assert.True(connection.Query<bool>("select CAST(1 AS BIT)").Single());它说明:只要查询返回的是 BIT 类型值,Dapper 就能自动转成 true / false。
常见问题与修复方式
MySQL 中 BIT 字段被误读为 UInt64
MySQL 的 Connector/NET 在某些版本中会把 BIT(1) 返回为 UInt64(值为 0 或 1),而 Dapper 原始逻辑未覆盖该路径,导致 InvalidCastException。
解决办法(兼容性补丁):
在自定义扩展或初始化阶段添加如下静态方法(参考 HackerVirus 博客修复方案):
public static bool ReadBool(object value)
{
if (value is bool b) return b;
if (value is byte b1) return b1 != 0;
if (value is int i) return i != 0;
if (value is long l) return l != 0;
return Convert.ToBoolean(value);
}然后在 SqlMapper 初始化前注入(需反射或源码修改)——不过更推荐升级到较新 Dapper 版本(≥2.1.30),该问题已在主流版本中修复。
SQL Server 的 BIT 映射正常,但注意 NULL 处理
SQL Server 的 BIT 列允许 NULL,对应 C# 应使用 bool?:
class User {
public int Id { get; set; }
public string Name { get; set; }
public bool? IsActive { get; set; } // ✅ 支持 NULL
}若用 bool 接收 NULL 值,会抛 InvalidOperationException。
自定义映射(按需启用)
如果默认行为仍不符合业务,可注册自定义 TypeHandler:
SqlMapper.AddTypeHandler<bool>(new SqlMapper.TypeHandler<bool>
{
SetValue = (p, v) => p.Value = v ? (object)1 : 0,
Parse = v => v switch
{
bool b => b,
byte b => b != 0,
int i => i != 0,
_ => Convert.ToBoolean(v)
}
});这样能完全掌控输入输出逻辑,也便于统一处理多数据库兼容性。
基本上就这些。Dapper 的 BIT → bool 映射本身不复杂,但容易忽略数据库驱动差异和 NULL 场景,稍加适配就能稳定运行。

















