- PR -

LINQのジェネリックメソッドでDbNullの変換エラー

1
投稿者投稿内容
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-08-13 01:24
お世話になります。
VB2008でLINQを使用しています。

http://msdn.microsoft.com/ja-jp/library/bb386916.aspx

を確認し

引用:

Field メソッドも SetField メソッドも Null 許容型を扱うことができるため、前出の例のように Null 値を明示的にチェックする必要はありません。


との記載があり、NULLを意識せずに下記のコードを実行したところ
「DbNullをIntegerにキャストできない」旨のエラーが発生しました。

コード:

Dim Query = From rowItem As DataRow In Dt _
        Order BY rowItem.Field(Of Integer)("SORT_COLUMN") _
          Select rowItem

Dim QueryDt As DataTable = Query.CopyToDataTable



このようなときには、やはりNullを考慮しないといけないでしょうか?

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-08-18 07:04
DbNull と null は、違うものです。null は意識しなくても、DbNull は意識してください。
NAL-6295
ぬし
会議室デビュー日: 2003/01/26
投稿数: 966
お住まい・勤務地: 東京
投稿日時: 2008-08-18 12:52
NAL-6295です。

久しぶりに書き込みます。

引用:

DbNull と null は、違うものです。null は意識しなくても、DbNull は意識してください。



これは、確かにそうなんだけど今回の例には当てはまらないと思います。
MSDNはDataRow.IsNullメソッドでチェックすることをNull値のチェックと記述しているので、ここでいうNull値とはDbNull相当のことを指しているのではないでしょうか。
で、Null許容型を扱うことができるためと書いてありながら、VBのサンプルでNull許容型を使っていない。
それをそのまま信じてコーディングすると

引用:

「DbNullをIntegerにキャストできない」旨のエラーが発生しました。



となる。

このような使い方をした事が無いので、あれですがMSDNを信じるなら

コード:

rowItem.Field(Of Nullable(Of Integer))("SORT_COLUMN")



としてみてはどうでしょうか。

追記:
MSDNに書かれている言葉の意味ですが、
Nullを意識しなくてよいわけではなく、
DBNull.Valueとnullの違いを明示的に意識しなくても良いようにNull許容型を利用する事ができるようになりました。

という事だと思いますよ。

[ メッセージ編集済み 編集者: NAL-6295 編集日時 2008-08-18 13:19 ]
Ts-Factory
常連さん
会議室デビュー日: 2006/08/08
投稿数: 42
投稿日時: 2008-08-18 20:58
NAL-6295さんよりご提示いただいたとおりNullableジェネリック型を
使用することで対応できました。

コード:

Dim Query = From rowItem As DataRow In Dt _
        Order BY rowItem.Field(Of Nullable(Of Integer))("SORT_COLUMN") _
          Select rowItem

Dim QueryDt As DataTable = Query.CopyToDataTable



ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)