2011-06-21 16 views
1

これは変です。今夜私の会社のサイトの機能を追加するときにこの問題に遭遇しました。.Net SqlDataReaderアイテムはNullです[VB]

私は、企業のイベントを表示するためにデータベースに問い合わせるカスタムカレンダーコントロールを構築しています。ここに状況があります。EndDateの値が格納されていて、devシステムでイベントの1つがNULLの値を持っています。それは唯一のテストシステムだから大したことはありませんが、とにかく安全な側でそれを使用しようとする前にチェックするかもしれません。

While dr.Read() 
    corporateTable.Rows.Add(New Object() { _ 
    Convert.ToDateTime(dr("EventBeginDate")) _ 
    , IIf(dr("EventEndDate") Is DBNull.Value, Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _ 
    , Convert.ToString(dr("EventType")) _ 
    , Convert.ToString(dr("EventDescription")) _ 
    , Convert.ToString(dr("EventMessage")) _ 
    }) 
End While 

しかし、それは、私はまだObject cannot be cast from DBNULLエラーを取得して保持していない:私は、次のコードが動作すると考えました。だから私はそれを考えて、このコードを思いつきましたが、私はそれが気に入らず、醜いと思います。本当に私を取得します

While dr.Read() 
    Dim column As Integer = 0 
    While column < dr.FieldCount - 1 
    If dr.GetName(column) = "EventEndDate" Then 
     Exit While 
    End If 

    column += 1 
    End While 
    corporateTable.Rows.Add(New Object() { _ 
    Convert.ToDateTime(dr("EventBeginDate")) _ 
    , IIf(dr.IsDBNull(column), Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), dr.Item(column)) _ 
    , Convert.ToString(dr("EventType")) _ 
    , Convert.ToString(dr("EventDescription")) _ 
    , Convert.ToString(dr("EventMessage")) _ 
    }) 
End While 

事があり、ある時点で、私はこれを持っていた:

, IIf(dr.IsDBNull(column), Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _ 

はそれがNULLない場合にのみdr()を評価する必要があるので、それが動作する必要があることを考えます。しかし、値が実際にはNULLだったので、最後にエラーを出し続けました。

最終的に私の質問には、長い説明を残して申し訳ありません。

値を使用する前にNULLであるかどうかをチェックしていても、NULLでないと呼び出されない部分でエラーが発生するのはなぜですか?私がIIF()を使用しているという事実と関係しているのですか?それは全文を評価していますか?または、dr()を使用すると、実行時に評価されますか?

私はちょうど困惑しており、正確に何が起こっているのか知りたいので、可能であれば、よりクリーンな解決策を思いついてください。

ありがとうございます!

答えて

5

IIfは常に両方の真と偽の部品を評価 - あなたはこれを避けたい場合は代わりに、インラインIfを使用します。

While dr.Read() 
    corporateTable.Rows.Add(New Object() { _ 
    Convert.ToDateTime(dr("EventBeginDate")) _ 
    , If(dr("EventEndDate") Is DBNull.Value, Convert.ToDateTime(dr("EventBeginDate")).AddDays(1), Convert.ToDateTime(dr("EventEndDate"))) _ 
    , Convert.ToString(dr("EventType")) _ 
    , Convert.ToString(dr("EventDescription")) _ 
    , Convert.ToString(dr("EventMessage")) _ 
    }) 
End While 
+0

ありがとうございます、私はそれを撃つでしょう。それが動作すれば、私は受け入れます。 –

+0

また、この方法を使用して拡張メソッドを作成することもできます。http://bradwilson.typepad.com/blog/2008/01/c-30-extension.html – turtlepick

+0

@ウィル:いつも笑うこの関数の 'IIf'は** ** if immediateの**の短縮形であり、これは真実から遠いものではありません。あなたがすぐに両方の条件を評価すると解釈しない限り。 =) – Yuck

0

をIIF関数は、各ステートメントを評価している、のようなあなたのnullをチェックするために別の構文を使用しますThe IF function

関連する問題