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

此时可以编写一个通用的方法来处理这种转换
| 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; |
| } |
| } |
| } |

点击查看代码
| 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 = 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); |
| } |
| } |

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

点击查看代码
| |
| 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; |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~