3

ExcelファイルをASP.NETDataTableにインポートしました。特にインデックス2と3では、一部の値が空白になっています。これらの空白のフィールドをに設定したいと思います0

デバッグ時には、との値row.item(2)row.item(3)両方ともSystem.DBNullです。興味深いことに、プログラムはステートメントを入力して値を0にIf設定しますが、ステートメントを入力することはありません。何が起こっている?これが私のコードです:row.item(2)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

編集:

ティムの提案に従って、私は自分のコードを次のように修正しました。

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

サンプルデータは提供されていないため、推測する必要があります。しかし、私の推測では、ElseIfではなく2つのIfステートメントが必要です。ElseIfは、Ifステートメントがfalseを返すかどうかのみを評価します。

于 2012-12-28T15:11:08.340 に答える