Проблема с наследованием и нулевым значением строго типизированного набора данных - PullRequest
1 голос
/ 12 августа 2011

Какой самый простой / чистый / самый простой / лучший способ для обработки нулевого значения строго типизированного набора данных в следующем случае:

  • Базовый класс имеет значение Nullable, которое устанавливается через его конструктор
  • Конструктор производного класса имеет строго типизированную строку набора данных в качестве параметра и создает исключение при доступе к нулевому значению.

Вот упрощенный пример, демонстрирующий проблему, с которой я сталкиваюсь.Любое сходство с вашим кодом является чисто случайным.

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 альтернативы, которые я рассмотрел.

1 Ответ

1 голос
/ 12 августа 2011

Это имеет смысл, вы должны проверить для DBNull, который не совпадает с Integer?

Вместо IIF, попробуйте оператор IF , ведьновичок в .NET 3.5.Вы также должны привести Nothing к Nullable(Of Integer), потому что функция If вернет 0 в противном случае;Тип возвращаемого значения определяется на основе более широких типов истинной части и ложной части.

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