You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用IDbMapper映射时int转System.String报错,如何解决?

解决IDataReader映射时int转string的类型转换问题

数据库返回的Id字段为int类型,但C#实体类Items的Id属性定义为string,导致自动映射时抛出类型转换错误,以下是几种可行的解决方法:

  • 自定义映射规则(适配IDbMapper)
    如果你的IDbMapper支持自定义属性级别的映射逻辑,可以针对Items.Id配置转换规则,读取数据库的int值后转为string:

    // 假设IDbMapper提供ConfigureProperty方法用于自定义映射
    _dbMapperItems.ConfigureProperty<Items>(item => item.Id, reader => 
    {
        int ordinal = reader.GetOrdinal("Id");
        return reader.IsDBNull(ordinal) ? null : reader.GetInt32(ordinal).ToString();
    });
    

    之后再执行_dbMapperItems.Map(reader)即可完成正确转换。

  • 修改实体类的属性转换逻辑
    调整Items类的Id属性,通过私有字段存储原始int值,对外暴露string类型的访问器:

    public class Items
    {
        private int? _id;
    
        public string Id 
        { 
            get => _id?.ToString(); 
            set => int.TryParse(value, out int parsedId) ? _id = parsedId : _id = null; 
        }
    
        public string Name { get; set; }
    }
    

    这种方式需要确保你的IDbMapper能够正确映射到私有字段(如果映射器默认只处理公共属性,可能需要额外配置)。

  • 手动读取并转换(最直接的方式)
    放弃自动映射,手动遍历IDataReader并完成字段转换:

    if (reader.NextResult())
    {
        int idOrdinal = reader.GetOrdinal("Id");
        int nameOrdinal = reader.GetOrdinal("Name");
        
        while (reader.Read())
        {
            types.Add(new Items
            {
                Id = reader.IsDBNull(idOrdinal) ? null : reader.GetInt32(idOrdinal).ToString(),
                Name = reader.IsDBNull(nameOrdinal) ? null : reader.GetString(nameOrdinal)
            });
        }
    }
    

    这种方式完全控制字段的读取和转换逻辑,无需依赖映射器的自动处理。

  • 注册全局类型转换器(针对第三方ORM)
    如果使用的是类似Dapper这类第三方ORM实现的IDbMapper,可以注册全局类型转换器处理int到string的转换:

    public class IntToStringTypeHandler : SqlMapper.TypeHandler<string>
    {
        public override string Parse(object value)
        {
            return value?.ToString();
        }
    
        public override void SetValue(IDbDataParameter parameter, string value)
        {
            // 如需反向写入数据库,添加string转int的逻辑
            parameter.Value = int.TryParse(value, out int result) ? result : DBNull.Value;
        }
    }
    
    // 注册转换器
    SqlMapper.AddTypeHandler(new IntToStringTypeHandler());
    

    注册后,ORM会自动处理所有int到string类型的映射转换。

内容的提问来源于stack exchange,提问作者Abhishek Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:45:25