【问题标题】:Problem with Inheritance and NullValue of a Strongly Typed DataSet强类型数据集的继承和 NullValue 问题
【发布时间】:2011-08-12 15:10:45
【问题描述】:

在以下情况下,处理强类型数据集的 Null 值的最简单/最干净/最简单/最好的方法是什么:

  • 基类有一个可以通过其构造函数设置的 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 个替代方案。

【问题讨论】:

  • 第一个构造函数抛出的异常是什么?在第二个,就像它说它必须是第一行,所以你必须弄清楚如何把你所有的逻辑放在一行上。 VB 很有趣!

标签: asp.net vb.net asp.net-3.5 strongly-typed-dataset


【解决方案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

【讨论】:

  • 您使用的是 .Net 4.0 吗?如果是这样,您可以使用If(...) 语句。
  • 看起来if(...) 语句是在 .NET 3.5 中引入的!所以我能够使用它。同时,当IsNumberNulltrue 时,如果返回0 而不是Nothing。解决方案是将Nothing 转换为Nullable(Of Integer),而不是转换整个if 语句。无论如何,我编辑了你的答案(再次),请接受我的编辑,所以我会接受你的答案并奖励你我昨晚过早放置的赏金。
  • @David 我很想知道在这种特殊情况下如何使用OrElse
猜你喜欢
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多