0

私が作成するプログラムのほとんどは通常組み込まれており、 (ループまたはLinqを介して)をDataTables選択し、次の行に沿って何かを記述して変数値を評価することにより、テーブルからデータを取得することがよくあります。DataRow

MyVar = ThisDataRow.Item("itm")

これは、特定のアイテムがである場合を除いて非常にうまく機能DBNullします。その場合、エラーが発生します。

さて、簡単な修正は、値を返すか、アイテムの値がであるかどうかを示す単純な関数/ ifステートメントを書くこと0です""が、どういうわけかオブジェクトを継承して新しいプロパティ(または何でも)を作成DBNullすることが理にかなっているのだろうかと思いますエラーが発生せず、正しい値が返されることはありません)。DataRowItemOrEmpty

これにより、次のいずれかを使用できるようになります。

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 に答える