首页 > 数据库 >对象不能从 DBNull 转换为其他类型,数据库空数据映射实体类的时候如何处理数据

对象不能从 DBNull 转换为其他类型,数据库空数据映射实体类的时候如何处理数据

时间:2024-03-04 15:01:23浏览次数:30  
标签:Convert 实体类 ConvertDBNull 映射 0f new ToString DBNull row

场景是这样的

数据库有几个字段是可以为空的、即插入的时候可以不插这些数据,当一条有‘缺口’的数据回到后端映射实体类的时候,会导致对象不能从 DBNull 转换为其他类型的错误

image

此时可以编写一个通用的方法来处理这种转换

public static T ConvertDBNull<T>(object value, T defaultValue = default(T))
        {
            if (value == DBNull.Value || value == null)
            {
                return defaultValue;
            }
            else
            {
                // 尝试将值转换为指定类型
                try
                {
                    return (T)Convert.ChangeType(value, typeof(T));
                }
                catch
                {
                    // 转换失败时返回默认值
                    return defaultValue;
                }
            }
        }

image

点击查看代码
 using (SqlCommand command = new SqlCommand(sql, Con))
                {
                    // 添加查询参数
                    command.Parameters.AddWithValue("@Date", data.Time.Date);
                    command.Parameters.AddWithValue("@Mac", data.Machine);
                    SqlDataAdapter sda = new SqlDataAdapter(command);
                    DataTable dt = new DataTable();
                    sda.Fill(dt);
                    foreach (DataRow row in dt.Rows)
                    {
                        int sv = Convert.ToInt32(row["StdValue"]);
                        TemperatureData temperatureData = new TemperatureData
                        {
                            Temperature = Convert.ToSingle(row["Temperature"]),
                            Time = Convert.ToDateTime(row["Time"]),
                            Machine = row["Machine"].ToString(),
                            StartTime = Convert.ToDateTime(row["StartTime"]),
                            ProcessID = row["LotNo"].ToString(),
                            MaterialName = row["MaterialName"].ToString(),
                            //StdValue = row["StdValue"].ToString()
                            StdValue = Convert.ToDateTime(row["StartTime"]).AddMinutes(sv),
                            Gluenumber = ConvertDBNull(row["Gluenumber"], string.Empty),
                            BakingTemp = ConvertDBNull(row["BakingTemp"], 0f),
                            StdTime= ConvertDBNull(row["StdTime"], 0f),
                            Alarmtime= ConvertDBNull(row["Alarmtime"], 0f),
                            maxtem = ConvertDBNull(row["maxtem"], 0f),
                            mintem = ConvertDBNull(row["mintem"], 0f)
                        };

                        temperatureList.Add(temperatureData);
                    }
                }

image

这样就解决了

标签:Convert,实体类,ConvertDBNull,映射,0f,new,ToString,DBNull,row
From: https://www.cnblogs.com/gho13954/p/18051800

相关文章

  • .NET Core AutoMapping 对象映射器转换
    先在NuGet程序包里下载这个文件然后新建一个类继承:ProfileusingAutoMapper;usingRBAC_Domain;usingRBAC_Domain.DTO;namespaceRBAC_Service.MyProFiles{///<summary>///转换对象映射器类///</summary>publicclassMappingProfile:Profile......
  • FRP(Fast Reverse Proxy)网络映射工具部署
    FastReverseProxy(FRP)是一款由fatedier开发的高性能的反向代理工具,用于穿透防火墙、NAT等网络障碍,将内网服务映射到公网上github地址https://github.com/fatedier/frp 下载https://github.com/fatedier/frp/releases根据操作系统找到对应版本,客户端服务端共用一个包。 ......
  • Taurus.MVC WebMVC 入门开发教程6:路由配置与路由映射
    前言:在本篇Taurus.MVCWebMVC入门开发教程的第六篇文章中,我们将讨论如何配置路由并映射到控制器和操作方法。路由是决定应用程序如何响应客户端请求的重要组成部分,因此在Web开发中非常重要。我们将继续使用Taurus.Mvc命名空间,并探讨如何在应用程序中配置路由。步骤1:了......
  • JdbcTemplate 自定义返回的结果集字段和实体类映射
    废话不多:抄袭代码packagecom.webank.wedatasphere.qualitis.handler;importcom.webank.wedatasphere.qualitis.response.Grid;importcom.webank.wedatasphere.qualitis.response.SelectRuleResponse;importorg.springframework.beans.factory.annotation.Autowired;impo......
  • 本地启动RocketMQ未映射主机名产生的超时问题
    问题描述参考RocketMQ官方文档在本地启动一个验证环境的时候遇到超时报错问题。本地环境OS:CentOSLinuxrelease8.5.2111首先,进入到RocketMQ安装目录,如:~/opt/rocketmq-all-5.2.0-bin-release。执行如下命令启动NameServer:$shbin/mqnamesrv该命令执行很慢,但是最终还是显......
  • 手写Mapper的映射文件(通用)
    <?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTDMapper3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="cn.edu.neu.hello_mybat......
  • .netCore之Automapper映射封装
    1.Automapper解说Automapper是一个对象与对象的关系映射库,目的就是帮助你实现源类型到目标类型的对象之间的映射2.Automapper的封装A.中间件中添加注册点击查看代码//Automapper映射builder.Services.AddAutoMapper(typeof(AutoMapperConfigs));B.添加特性公共类获取......
  • 23 - 集合与映射类型
    集合与映射类型集合类型(SetType)集合类型对象是由具有唯一性的可哈希对象所组成的无序多项集。由于集合类型是无序的,它并不记录元素位置或插入顺序,因此集合类型不支持索引、切片或其他序列类的操作。类型对应关键字构造函数是否可变是否可哈希setsetset()可......
  • RxJS中高阶映射操作符的全面讲解:switchMap, mergeMap, concatMap (and exhaustMap)
    原文链接:https://blog.angular-university.io/rxjs-higher-order-mapping/有一些在日常开发中常用的RxJS的操作符是高阶操作符:switchMap,mergeMap,concatMap,以及exhaustMap。举个例子,程序中大多数的网络请求都是通过以上某个操作符来完成的,所以为了能够写出几乎所有反应式编程,必须......
  • Mybatis---结果映射-自动映射
    https://mybatis.org/mybatis-3/zh_CN/sqlmap-xml.html#Auto-mapping 正如你在前面一节看到的,在简单的场景下,MyBatis可以为你自动映射查询结果。但如果遇到复杂的场景,你需要构建一个结果映射。但是在本节中,你将看到,你可以混合使用这两种策略。让我们深入了解一下自动映射是怎......