2011-08-12 2 views
1

Quel est le plus simple/propre/plus facile/meilleure façon de gérer la valeur nulle d'un DataSet fortement typées dans le cas suivant:problème avec l'héritage et NullValue d'un DataSet fortement typé

  • Une classe de base a une Nullable Valeur définie par le constructeur
  • Le constructeur de la classe dérivée a la ligne DataSet fortement typée comme paramètre et l'exception Throw lors de l'accès à une valeur null.

Voici un exemple simplifié pour illustrer le problème auquel je suis confronté. Toute ressemblance avec votre code est purement fortuite.

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 

J'ai mis 3 Public Sub New que pour montrer 3 alternatives je considérais.

+0

Quelle est l'exception levée sur votre premier constructeur? Sur le second, comme dit il doit être la première ligne, donc vous devez comprendre comment mettre toute votre logique sur une ligne. VB est amusant! – Jay

Répondre

1

Cela est logique, vous devez vérifier DBNull, ce qui est la même chose que Integer?

Au lieu de IIF, Essayez la IF Operator, sorcière est nouveau pour .NET 3.5. Vous devez également convertir Nothing en Nullable(Of Integer) car la fonction If renvoie 0 sinon; Le type de retour de la valeur de retour est décidé basé sur on the wider of the types de la partie réelle et la partie fausse.

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

OrElse sauve la vie ... – David

+0

Utilisez-vous .Net 4.0? Si c'est le cas, vous pouvez utiliser l'instruction 'If (...)'. – Jay

+0

On dirait que l'instruction 'if (...)' a été introduite avec .NET 3.5! Donc j'ai été capable de l'utiliser. Pendant ce temps, if renvoyait '0' au lieu de' Nothing' quand 'IsNumberNull' était' true'. La solution consiste à lancer 'Nothing' à un' Nullable (Of Integer) 'au lieu de lancer l'instruction if entière. Quoi qu'il en soit, j'ai édité votre réponse (à nouveau), s'il vous plaît accepter mon édition, donc je vais accepter votre réponse et vous attribuer la prime que j'ai prématurément placé la nuit dernière. – DavRob60

Questions connexes