通八洲科技

Dapper如何处理数据库返回的DBNull Dapper DBNull.Value转换方法

日期:2026-01-01 00:00 / 作者:月夜之吻
Dapper 默认将 DBNull.Value 映射为对应类型的默认值(如 int→0、int?→null),易掩盖空值问题;应优先使用可空类型,配合 TypeHandler、SQL COALESCE 或自定义映射安全处理 NULL。

Dapper 默认会将数据库中的 DBNull.Value 映射为对应 .NET 类型的默认值(如 null0false),但这种隐式转换容易掩盖空值问题,尤其在可空类型(int?DateTime?)或自定义逻辑中需要显式区分 NULL 和默认值时。关键不是“怎么转”,而是“怎么安全地识别和处理”。

理解 Dapper 对 DBNull 的默认行为

Dapper 在填充实体时,对字段值做如下判断:

手动检查 DBNull 的几种实用方式

当需要在映射前/后精确控制空值逻辑(比如记录日志、触发业务规则、统一转成特定默认值),推荐以下方法:

推荐:用 TypeHandler 统一处理 DBNull(适合全局策略)

若项目中大量存在某类字段(如所有 decimal 字段都应转为 0m 而非 null),可注册自定义 TypeHandler

SqlMapper.AddTypeHandler(new DecimalTypeHandler());
// 实现示例:
public class DecimalTypeHandler : SqlMapper.TypeHandler
{
    public override void SetValue(IDbDataParameter parameter, decimal value) => 
        parameter.Value = value;
    public override decimal Parse(object value) => 
        value == DBNull.Value ? 0m : Convert.ToDecimal(value);
}

这样所有 decimal 列都会按你的规则解析,无需改实体或 SQL。

避免踩坑的注意事项

几个常见误区要避开:

基本上就这些。核心是:用可空类型承接可能为 NULL 的列,必要时用 TypeHandler 或 SQL 层统一兜底。不复杂但容易忽略细节。