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