为什么这个程序没有输入我的ElseIf语句--System.DBNull

时间:2012-12-28 15:07:44

标签: asp.net vb.net if-statement dbnull

我将Excel文件导入ASP.NET DataTable。有些值是空白的,特别是在索引2和3处,我想将这些空白字段设置为0

调试时,row.item(2)row.item(3)的值均为System.DBNull。有趣的是,程序输入If语句并将row.item(2)值设置为0,但它从不输入ElseIf语句。到底是怎么回事?这是我的代码:

If row.Item(2) Is Nothing OrElse row.Item(2).ToString = "" OrElse IsDBNull(row.Item(2)) Then
    dt.Rows.Item(i).SetField(2, 0)

ElseIf row.Item(3) Is Nothing OrElse row.Item(3).ToString = "" OrElse IsDBNull(row.Item(3)) Then
    dt.Rows.Item(i).SetField(3, 0)
End If

编辑:

Per Tim的建议,我修改了我的代码如下:

If Not row.Field(Of Int32?)(2).HasValue Then
    dt.Rows.Item(i).SetField(2, 0)
End If

If Not row.Field(Of Int32?)(3).HasValue Then
    dt.Rows.Item(i).SetField(3, 0)
End If

但是,这会引发错误 - Object cannot be cast from DBNull to other types

调试时,在第一个循环中:

row.Item(2) = 17

row.Item(3) = 1

理论上,它应该跳过这个迭代并继续下一个。但是,我的程序立即捕获异常并出现上述错误。

2 个答案:

答案 0 :(得分:8)

由于您的if正在执行,您的else if将无法执行。

如果您希望else if逻辑执行,即使您的if已执行,只需将其设为自己的if块:

If row.Item(2) Is Nothing OrElse row.Item(2).ToString = "" OrElse IsDBNull(row.Item(2)) Then
    dt.Rows.Item(i).SetField(2, 0)
End If

If row.Item(3) Is Nothing OrElse row.Item(3).ToString = "" OrElse IsDBNull(row.Item(3)) Then
    dt.Rows.Item(i).SetField(3, 0)
End If

答案 1 :(得分:1)

您不提供样本数据,因此我们只需要猜测。但我的猜测是你需要两个If语句..而不是ElseIf。 ElseIf仅评估If语句是否返回false。