2011-08-12 107 views
1

什麼是最簡單的/清潔/處理在以下情況下,一個強類型DataSet中的空值最容易/最好的方法:問題的一個強類型DataSet的繼承和NullValue屬性

  • 一個基類有一個可空通過它的構造函數設置的值
  • 派生類的構造函數具有強類型DataSet Row作爲參數,並且在訪問空值時拋出異常。

這裏是一個簡化的例子來演示我面臨的問題。任何與你的代碼相似的東西純屬巧合。

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 Public Sub New只顯示3個替代我考慮。

+0

什麼是第一個構造函數拋出的異常?第二個,就像它說它必須是第一行,所以你必須弄清楚如何把所有的邏輯放在一條線上。 VB很有趣! – Jay

回答

1

這是有道理的,你要檢查DBNull,這是不一樣的Integer?

相反的IIF,嘗試IF Operator,女巫是新的.NET 3.5。您還必須將Nothing轉換爲Nullable(Of Integer),因爲否則If函數將返回0;返回值的返回類型根據真實部分和虛假部分的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(...)」語句!所以我能夠使用它。同時,當「IsNumberNull」爲「true」時,if返回'0'而不是'Nothing'。解決方法是將'Nothing'轉換爲'Nullable(Of Integer)'而不是轉換整個if語句。無論如何,我編輯你答覆(再次),請接受我的編輯,所以我會接受你的答案,並獎勵你昨晚我過早放置的賞金。 – DavRob60