无法将DBNULL值插入到SQL Server中。

3
为什么会出现这个错误?
Object cannot be cast from DBNull to other types.

当我在SQL Server 2005中为数值数据类型插入空值时,以下是我的代码:
 if (MeasurementTr.Visible == true)
    {
        materialIn.measurementId = Convert.ToInt64(DlMeasurement.SelectedValue.ToString());
    }
    else
    {
        materialIn.measurementId = Convert.ToInt64(DBNull.Value);
    }

编辑

这正确吗?

 materialIn.measurementId = (Convert.ToInt64(DlMeasurement.SelectedValue.ToString()) != 0) ? Convert.ToInt64(DlMeasurement.SelectedValue.ToString()) : 0;

不,你不能将 DBNull 转换为 Int64。你需要先验证对象值是否不是 DBNull! - Fitzchak Yitzchaki
1
问题出在else块上。我确定if块没问题(ToString永远不会返回DBNull.Value)。就像我说的 - 如果是这样,可以在DataRow上使用SetNullSetmeasurementIdNull方法,或者将其设置为nulldefault(Int64)(如果它是非空类型)。 - Aaronaught
@Aaronaught 我错过了 else 部分... 你是对的,加一。 - Fitzchak Yitzchaki
3个回答

5
你不能将你的代码中尝试转换为Int64的DBNull.Value进行转换。DBNull.Value表示“未知”或“不存在”,因此逻辑上无法转换为任何其他数据类型。
如果materialIn实例是某种强类型DataRow,它将具有SetMeasurementIdNull方法,这就是你需要使用的方法。如果你正在使用Linq to SQL或EF,则根本不需要处理DBNull,而是只需编写materialIn.measurementId = null即可。

1

因为该对象无法从DBNull转换为其他类型。

所以您需要检查DBNull的值。

materialIn.measurementId = DlMeasurement.SelectedValue == DBNull.Value ? 0 : Convert.ToInt64(DlMeasurement.SelectedValue.ToString());


@Mendy 运算符“==”不能应用于类型为“string”和“System.DBNull”的操作数。 - bala3569
但是SelectedValue是一个对象,不是吗? - Fitzchak Yitzchaki

0

DBNull无法转换为Int64。您需要使用可空整数,然后将null存储在值中,或者对值进行某些处理以表示null,例如可以存储在属性中的0。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接