[.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") で済んじゃうのに…。
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
この記事へのコメントは終了しました。
コメント
ありゃ、どーもすみません m(_`_)m
三角カッコが消されちゃうのか!?
C#では、こうですね。
var moge = r.Field<int?>("moge")
※ コメント欄の設定を変更しました。
・< で <、> で > が出ます。
・url の自動判定が効かなくなったので、 リンクしたいときは a 要素を書いてください。
# まったくもー、どーゆー仕様なんだ!? (`ω')凸 > cocolog
投稿: biac | 2010年8月19日 (木) 20時48分
あれ?ちゃんと書いてたはず??
消えちゃうとか?
半角:
全角:<test>
投稿: | 2010年8月19日 (木) 17時13分
C#の方、間違えました;
投稿: | 2010年8月19日 (木) 17時10分
こんにちは。
VS2008でしたら・・・
C#
var moge = r.Field("moge")
VB
Dim moge = r.Field(Of Integer?)("moge")
投稿: | 2010年8月19日 (木) 17時09分