2010-01-26 64 views
3

为什么我得到这个错误?不能将DBNULL值插入到sql server中

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; 
+0

不,您不能将DBNull转换为Int64。您首先需要验证对象值不是DBNull! – 2010-01-26 05:20:58

+1

这是'else'块,这是问题所在。我确定'if'块没问题('ToString'永远不会返回'DBNull.Value')。正如我所说 - 在DataRow上使用'SetNull'或'SetmeasurementIdNull'方法,如果是这样的话,或者如果它是不可空的,只是将其设置为'null'或'default(Int64)'。 – Aaronaught 2010-01-26 05:29:50

+0

@Aaronaught我错过了其他部分......你正确和+1。 – 2010-01-26 05:44:00

回答

5

由于代码试图在Convert.ToInt64中执行操作,因此无法将DBNull.Value转换为Int64DBNull.Value表示“未知”或“不存在”,因此没有逻辑转换为任何其他数据类型。

如果materialIn实例是某种形式的强类型DataRow,它将有一个SetMeasurementIdNull方法,这是您需要使用的方法。如果您使用Linq to SQL或EF,则根本不需要处理DBNull,而只需编写materialIn.measurementId = null

1

因为这Object cannot be cast from DBNull to other types.

所以,你需要做的是检查值DBNull

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

+0

@Mendy运算符'=='不能应用于'string'和'System.DBNull'类型的操作数 – bala3569 2010-01-26 05:05:26

+0

但是SelectedValue是对象,不是吗? – 2010-01-26 05:09:04

+0

你能用正确的答案编辑我的问题吗 – bala3569 2010-01-26 05:11:02

0

DBNull不会转换为Int64。您将需要使用一个可为空的int值,然后将值存储在值中,或者对该值执行某些操作以表示可以存储在属性中的null(例如0)。