2011-08-12 1 views
1

問題の最も簡単な/クリーン/以下の場合には厳密に型指定されたDataSetのnull値を処理するための最も簡単な/最良の方法は何

  • 基底クラスのNullableを持っているが、
  • 派生クラスのコンストラクタは、厳密に型指定されたDataSet Rowをパラメータとして持ち、null値にアクセスするときに例外をスローします。

私が直面している問題を示す簡単な例です。コードとの類似点はまったく偶然です。

Public MustInherit Class BaseClass 
    Private _Number as Nullable(of integer) 
    Public Sub New(Number as Nullable(of integer)) 
     _Number = Number 
    End Sub 
End Class 

Public Class DerivedClass 
    Inherits BaseClass 

    'Throw System.Data.StrongTypingException "The value for column 'Number' 
    'in table 'SomeData' is DBNull." when Number is null 
    Public Sub New(DataRow as my DataDLL.SomeDataRow) 
      MyBase.New(DataRow.Number) 
    End Sub 

    'First statement of this 'Sub New' must be a call to 'MyBase.New' 
    'or 'MyClass.New' because base class 'BaseClass' of 'DerivedClass' 
    'does not have an accessible 'Sub New' that can be called with no arguments 
    Public Sub New(DataRow as my DataDLL.SomeDataRow) 
     If TermRow.IsNumberNull() Then 
       MyBase.New(Nothing) 
     Else 
       MyBase.New(DataRow.Number) 
     End If 
    End Sub 

    'Also Throw System.Data.StrongTypingException because As part of preparing 
    'the argument list for the call to IIf, the Visual Basic compiler calls 
    'every function in every expression. 
    Public Sub New(DataRow As MyData) 
     MyBase.New(DirectCast(IIf(DataRow.IsNumberNull(), _ 
            Nothing, _ 
            TermRow.Number), Nullable(Of Integer))) 
    End Sub 

End Class 

私は私が考えられ3つの選択肢を表示するために3 Public Sub Newを置きます。理にかなって

+0

最初のコンストラクタでスローされた例外は何ですか? 2つ目は、最初の行でなければならないと言うように、すべてのロジックを1行にまとめる方法を理解する必要があります。 VBは楽しい! – Jay

答えて

1

、あなたがIF Operatorを試してみて、Integer?

代わりのIIFと同じではありませんこれは、DBNullをチェックする必要があり、魔女は、.NET 3.5の新機能です。 If関数は0を返すため、NothingNullable(Of Integer)にキャストする必要があります。戻り値の戻り型は、真部分と偽部分のon the wider of the typesに基づいて決定されます。

Public Sub New(DataRow As MyData) 
    MyBase.New(If(DataRow.IsNumberNull(), _ 
        DirectCast(Nothing, Nullable(Of Integer)), _ 
        DataRow.Number)) 
End Sub 
+0

OrElseは人生を節約します... – David

+0

.Net 4.0を使用していますか?もしそうなら、 'If(...)'ステートメントを使うことができます。 – Jay

+0

.NET 3.5では、if(...)ステートメントが導入されたようです。だから、私はそれを使用することができました。一方、Ifは 'IsNumberNull'が' true'のときに 'Nothing'ではなく' 0'を返していました。解決策は、if文全体をキャストするのではなく、 'Nothing'を' Nullable(Of Integer) 'にキャストすることです。とにかく、私はあなたの答えを編集しました。もう一度、私の編集を受け入れてください。私はあなたに答えて、私が昨晩中途半端に置いた賞金をあなたに授与することを認めます。 – DavRob60

関連する問題