【VB.NET】DataTable Selectメソッドの注意点① | LDKの徒然日記

LDKの徒然日記

脱力系エンジニアの日常を綴る・・・

現在携わっているプロジェクトでは、VisualStudio2005を使用しています。
なのでLINQは使えません。

DataTableとDataTableの結合は自前でDataViewオブジェクトを用意し、
ゴリゴリ書く必要がありますね。

とまぁ。それは今回の話題ではありません。

えっと。DataTable内のデータ取得については、DataTableオブジェクトの組み込みメソッドである
DataTable.Selectメソッドを利用できます。

以前にも記事にしましたが、このSelectメソッドに癖があることがわかりました。

どういう内容かといいますと、

例えば以下のようなデータが入っていたと仮定します。

項目CD 項目名称
空白 りんご
01 みかん
空白 めろん
04 ぶどう


上記の表の項目CDの「空白」とは、String.Emptyを意味します。

で、この表の項目CDの重複をチェックした場合、
空白を抽出しようとした場合、2件となるはずですよね。
つまりは1行目と3行目は空白値で重複しています。

ロジックで表現すると以下のようになります。

Dim dtRow() As DataRow ' 抽出結果を格納するための入れ物
Dim dt As DataTable ' 上述の表情報

dtRow = DirectCast(dt.Select("項目CD = ''"),DataRow())

dtRow.Length は2件となって欲しいところです。

しかし、空白を取得する場合、Selectメソッド内、=では抽出できません。

ここでは IS NULL を使うのが正解となります。
つまりは、以下

dtRow = DireactCast(dt.Select("項目CD IS NULL"),DataRow())

逆もしかりですね。

dtRow = DireactCast(dt.Select("項目CD IS NOT NULL"),DataRow())


次は、項目CD に 半角スペースなどが入っていた場合。

dtRow = DirectCast(dt.Select("項目CD = ' '"),DataRow())

これでいけると思いきや。

dtRowには入ってきません。

DataTableを使用してSelectメソッドを使用したい場合、そのKeyとなる情報に対し、
NULLレコードや、半角スペース、全角スペース、タブ、改行(CRLF)等の値が入ってくる可能性が
ある場合は、バグの温床となるため、Selectメソッドを使用しないほうが良いかもしれません。

以下のように素直にLoopで回しましょう

Dim wkSrh As String = " " ' 半角空白

For i As Integer = 0 To dt.Rows.Count - 1
If wkSrh = dt.Rows(i)("項目CD") Then
Call MsgBox("重複値を発見!")
End If
Next

にしてもLINQを使えないってやっぱ不便だ。