3

我将 Excel 文件导入到 ASP.NET 数据表中。有些值是空白的,特别是在索引 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

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

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

row.Item(2) = 17

row.Item(3) = 1

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

4

2 回答 2

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
于 2012-12-28T15:10:51.233 回答
1

你不提供样本数据,所以我们只需要猜测。但我的猜测是你想要两个 If 语句.. 而不是 ElseIf。ElseIf 将仅在 If 语句返回 false 时进行评估。

于 2012-12-28T15:11:08.340 回答