You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加数据库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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 09:05:27