OverRide DataRow的.Item属性允许DBNULLS

时间:2013-03-08 20:03:58

标签: .net vb.net

我发现我编写的大多数程序通常包含DataTables,我经常通过选择DataRow(通过循环或Linq)并通过以下方式确定我的变量值来从表中提取数据写下以下内容:

MyVar = ThisDataRow.Item("itm")

这非常有效,除非特定项目是DBNull,在这种情况下它会引发错误。

现在,一个简单的解决方法是编写一个简单的函数/ if语句,如果项的值为0,则返回值或""DBNull,但我想知道如果以某种方式继承DataRow对象并创建一个新属性ItemOrEmpty(或任何你想要调用它),这将不会引发错误并返回正确的值。

这将允许我使用:

MyVar = ThisDataRow.Item("itm")

MyVar = ThisDataRow.ItemOrEmpty("itm")

取决于我是否要为Nulls陷阱。

我的问题是:

  1. 我不知道如何做到这一点并让DataTable使用这个新对象而不是DataRow - 好像我需要重载DataRow对象而不是创建一个新对象,但我不知道我不知道怎么做。
  2. 这是好主意吗?为什么这么认为?
  3. 这会增加大量的开销,而不仅仅是创建一个我每次运行DataRow.Item的简单函数吗?
  4. 基本上,这是一个相当理论上的问题 - 总体来说这是好还是坏?这怎么可能实现呢?

    感谢!!!

1 个答案:

答案 0 :(得分:1)

为了完整起见 - 对于任何来自这个问题的人 - 我最终做到这一点的方式是接受@Tim的建议并编写我自己的扩展方法。 请注意,这是我写过的第一篇,所以请告诉我是否有更好的方法来编写它。

''' <summary>
''' Returns the item from a DataRow and, if it is DBNull, it returns a specified default value
''' </summary>
''' <param name="ColumnName">The name of the Column in the datarow we want the value from.</param>
''' <param name="DefaultValue">The default value for that column if it is NULL.</param>
<System.Runtime.CompilerServices.Extension()> _
Public Function ItemOrEmpty(Of T)(ByVal dr As DataRow, ByVal ColumnName As String, ByVal DefaultValue As T) As T
    If dr.Item(ColumnName) Is Nothing Or IsDBNull(dr.Item(ColumnName)) Then
        Return DefaultValue
    Else
        Return dr.Item(ColumnName)
    End If
End Function

希望这有助于其他人......