なので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を使えないってやっぱ不便だ。