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

3
我将一个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

编辑:

根据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

然而,这会抛出一个错误--无法将DBNull转换为其他类型

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

row.Item(2) = 17

row.Item(3) = 1

理论上,它应该跳过此次迭代并继续下一个。 然而,我的程序立即捕获了上述错误的异常。

2个回答

8

由于您的if正在执行,因此您的else if将不会执行。

如果您希望即使if执行,也要执行else 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
哇,那就像是编程入门课,而我却失败了。谢谢! - user1077685
2
附注:最好使用强类型的“Field”扩展方法,它还支持可空类型。例如:If Not row.Field(Of Int32?)(2).HasValue row.SetField(2, 2) End If - Tim Schmelter
@TimSchmelter 感谢您的提示。不幸的是,强类型的“Field”扩展对我来说无法工作。请参见主帖编辑以获取详细信息。 - user1077685
@TimSchmelter 刚刚打完了。 - user1077685
@user1496816:明天我会看一下,现在没时间 :) - Tim Schmelter

1

您没有提供样本数据,所以我们只能猜测。但是我的猜测是您想要两个 If 语句,而不是 ElseIf。ElseIf 只有在 If 语句返回 false 时才会被评估。


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