添加数据库img表的pic1后出现Object cannot be cast from DBNull错误
解决“Object cannot be cast from DBNull to other types”错误
问题原因
你用了FULL OUTER JOIN关联rent和img表,当rent表的记录在img表中没有匹配的r_id时,img表的所有字段(包括pic1)会返回DBNull值,直接调用ToString()就会触发这个类型转换错误。另外你代码里的area字段如果也可能为DBNull,同样会出现类似问题。
解决方案
1. 直接判断DBNull后赋值
给pic1赋值前先检查是否为DBNull,是空值就替换成空字符串:
pic1 = dr["pic1"] == DBNull.Value ? string.Empty : dr["pic1"].ToString(),
同理,area字段也需要处理,避免同样的错误:
area = dr["area"] == DBNull.Value ? 0 : Convert.ToInt32(dr["area"]),
2. 修改SQL语句,给空值设置默认值
在SQL里用ISNULL(SQL Server)或COALESCE函数,给pic1和可能为空的字段设置默认值,同时建议不要用SELECT *,明确指定字段更安全:
SELECT rent.id, rent.tittle, rent.descrip, ISNULL(rent.area, 0) AS area, rent.areaUnit, rent.bathroom, rent.bedroom, rent.province, rent.city, rent.stadress, rent.furnished, rent.p_type, rent.price, ISNULL(img.pic1, '') AS pic1 FROM rent FULL OUTER JOIN img ON rent.id = img.r_id
3. 封装扩展方法简化判断
写一个DataRow的扩展方法,统一处理字符串和整数类型的空值判断,后续所有字段都可以复用:
public static class DataRowExtensions { public static string GetSafeString(this DataRow row, string columnName) { return row[columnName] == DBNull.Value ? string.Empty : row[columnName].ToString(); } public static int GetSafeInt(this DataRow row, string columnName) { return row[columnName] == DBNull.Value ? 0 : Convert.ToInt32(row[columnName]); } }
赋值时直接调用:
id = dr.GetSafeInt("ID"), area = dr.GetSafeInt("area"), pic1 = dr.GetSafeString("pic1"), // 其他字符串字段也可以用GetSafeString
内容的提问来源于stack exchange,提问作者Creative Things
相关产品推荐
相关产品推荐

