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

场景是这样的

数据库有几个字段是可以为空的、即插入的时候可以不插这些数据,当一条有‘缺口’的数据回到后端映射实体类的时候,会导致对象不能从 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

这样就解决了

2024/06/13更新新方法
可以不写通用方法,用Convert类IsDBNull进行判断、再用三目运算符赋初值就行
image

点击查看代码
                // 将数据库返回的数据转换为WGCheckInfo对象列表
                var result = new List<WGCheckInfo>();
                foreach (DataRow row in dt.Rows)
                {
                    result.Add(new WGCheckInfo
                    {
                        OrderNo = orderNo,
                        PdQty = Convert.IsDBNull(row["PdQty"]) ? 0 : Convert.ToDecimal(row["PdQty"]),
                        NGzw = Convert.IsDBNull(row["NGzw"]) ? 0 : Convert.ToDecimal(row["NGzw"]),
                        NGqip = Convert.IsDBNull(row["NGqip"]) ? 0 : Convert.ToDecimal(row["NGqip"]),
                        NGyj = Convert.IsDBNull(row["NGyj"]) ? 0 : Convert.ToDecimal(row["NGyj"]),
                        NGqep = Convert.IsDBNull(row["NGqep"]) ? 0 : Convert.ToDecimal(row["NGqep"]),
                        NGjt = Convert.IsDBNull(row["NGjt"]) ? 0 : Convert.ToDecimal(row["NGjt"]),
                        NGqx = Convert.IsDBNull(row["NGqx"]) ? 0 : Convert.ToDecimal(row["NGqx"]),
                        NGlx = Convert.IsDBNull(row["NGlx"]) ? 0 : Convert.ToDecimal(row["NGlx"]),
                        NGmp = Convert.IsDBNull(row["NGmp"]) ? 0 : Convert.ToDecimal(row["NGmp"]),
                        NGbc = Convert.IsDBNull(row["NGbc"]) ? 0 : Convert.ToDecimal(row["NGbc"]),
                        NGtx = Convert.IsDBNull(row["NGtx"]) ? 0 : Convert.ToDecimal(row["NGtx"]),
                        NGlh = Convert.IsDBNull(row["NGlh"]) ? 0 : Convert.ToDecimal(row["NGlh"]),
                        NGlg = Convert.IsDBNull(row["NGlg"]) ? 0 : Convert.ToDecimal(row["NGlg"]),
                        NGjl = Convert.IsDBNull(row["NGjl"]) ? 0 : Convert.ToDecimal(row["NGjl"]),
                        NGyl = Convert.IsDBNull(row["NGyl"]) ? 0 : Convert.ToDecimal(row["NGyl"])
                    });
                }

                return result;
posted @ 2024-03-04 14:51  咸鱼过海  阅读(601)  评论(0编辑  收藏  举报