0

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

MyVar = ThisDataRow.Item("itm")

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

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

这将允许我使用:

MyVar = ThisDataRow.Item("itm")

或者

MyVar = ThisDataRow.ItemOrEmpty("itm")

取决于我是否想诱捕Nulls

我的问题是:

  1. 我不知道如何做到这一点并使 DataTable 使用这个新对象而不是 DataRow - 似乎我需要重载DataRow对象而不是创建新对象,但我不知道该怎么做。
  2. 这是一个好/坏主意吗?你为什么这么认为?
  3. 这会增加大量开销,而不仅仅是创建一个我DataRow.Item每次都运行的简单函数吗?

基本上,这是一个相当理论化的问题——这总体上是好还是坏,如何实现?

谢谢!!!

4

1 回答 1

2

为了完整起见-对于遇到此问题的任何人-我最终这样做的方式是接受@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

希望这可以帮助其他人...

于 2013-03-13T18:07:16.490 回答