« [MEMO] 離れていてもペアプロ!? | トップページ | VS2010EE で色々と出す方法 »

2010年8月10日 (火)

[.NET] DataRow から値を取り出すときって、DBNull かどうかチェックしてからキャスト… 面倒だよぉ

…と思っていたら。 .NET 3.5 から変わってたようです。
開発では型付きデータセットばかり使っていたので、 気付かなかったw

【 従来 】

For Each r As DataRow In dt.Rows
Dim hoge As String
If (DBNull.Value.Equals(r("hoge"))) Then
hoge = Nothing
Else
hoge = CType(r("hoge"), String)
End If

Dim moge As Nullable(Of Integer)
If (r.IsNull("moge")) Then '←こうも書ける
moge = Nothing
Else
moge = CType(r("moge"), Integer)
End If

'* …こんな調子で続く

Next

これが、 System.Data.DataRowExtensions の Field<T> メソッドを使うと…

【 こんなに楽に! 】

For Each r As DataRow In dt.Rows
Dim hoge As String _
    = r.Field(Of String)("hoge")

Dim moge As Nullable(Of Integer) _
    = r.Field(Of Nullable(Of Integer))("moge")

'* …いい調子で続く (^^)

Next

 
* (同夜、 さっそく訂正)
2つめの、 型が違うやん。 なんでコンパイル通るのよ? (汗;
てことで、 Field(Of Integer) → Field(Of  Nullable(Of Integer)) に訂正。 (試してないけど、 そのはず f(^^; )

# それにしても、 ジェネリックやラムダ式って VB では書きづらい。 構文を C# 用に考えてから、 ムリヤリ VB に 「翻訳」 したとかなんじゃなかろーか。 VB でのラムダなんて、 毎回 MSDN 引いて書きかた調べてるよw
上の例の最後のヤツも C# なら、 int? moge = r.Field<int?>("moge") で済んじゃうのに…。

|

« [MEMO] 離れていてもペアプロ!? | トップページ | VS2010EE で色々と出す方法 »

プログラミング」カテゴリの記事

コメント

こんにちは。
VS2008でしたら・・・

C#
var moge = r.Field("moge")

VB
Dim moge = r.Field(Of Integer?)("moge")

投稿: | 2010年8月19日 (木) 17時09分

C#の方、間違えました;

投稿: | 2010年8月19日 (木) 17時10分

あれ?ちゃんと書いてたはず??
消えちゃうとか?
半角:
全角:<test>

投稿: | 2010年8月19日 (木) 17時13分

ありゃ、どーもすみません m(_`_)m
三角カッコが消されちゃうのか!?

C#では、こうですね。
var moge = r.Field<int?>("moge")


※ コメント欄の設定を変更しました。
・&lt; で <、&gt; で > が出ます。
・url の自動判定が効かなくなったので、 リンクしたいときは a 要素を書いてください。

# まったくもー、どーゆー仕様なんだ!? (`ω')凸 > cocolog

投稿: biac | 2010年8月19日 (木) 20時48分

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/209349/49111977

この記事へのトラックバック一覧です: [.NET] DataRow から値を取り出すときって、DBNull かどうかチェックしてからキャスト… 面倒だよぉ:

« [MEMO] 離れていてもペアプロ!? | トップページ | VS2010EE で色々と出す方法 »