对象不能从 DBNull 转换为其他类型,数据库空数据映射实体类的时候如何处理数据
场景是这样的
数据库有几个字段是可以为空的、即插入的时候可以不插这些数据,当一条有‘缺口’的数据回到后端映射实体类的时候,会导致对象不能从 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 = 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);
}
}
这样就解决了
2024/06/13更新新方法
可以不写通用方法,用Convert类IsDBNull进行判断、再用三目运算符赋初值就行
点击查看代码
// 将数据库返回的数据转换为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;