中年システムエンジニアのオモチャ箱

中年システムエンジニアが初体験のブログ活動。技術情報の備忘録以外も、色々と載せていければと思います。


VB.NET DataTable のレコードを Where 句のように抽出する方法


【スポンサーリンク】


システム開発で欠かせないのが、データベースですよね。

以前、DataTable クラスを使用して Distinct(重複行の除外)する方法をご紹介しました。

www.ma-se.com

 

今回は、SQL の Where 句のように、抽出したレコードに対して、更に条件を用いて抽出する(フィルターする)方法をご紹介します!

DataView クラスの RowFilter プロパティで実現可能!

SQL の Where 句のように、抽出したレコードに対して、更にフィルターする場合は、DataView クラスの RowFilter プロパティを使用することにより、実現可能です!

では、サンプルプログラムを使って見ていきましょう!

尚、フォームには DataGridView コントロール(GrdNormal、GrdFilder_OK と GrdFilder_Err)を 3 つ追加してあります。

 

下記ソースコードで、DataTable オブジェクト(変数 dt)にデータがセットされていることを前提に説明していきますね。

 

ソースコード 1

'変数の宣言
Dim dt As New DataTable()
Dim row As DataRow = Nothing

 

'DataTable に列を作成
dt.Columns.Add("EMP-CD", Type.GetType("System.String"))
dt.Columns.Add("EMP_NAME", Type.GetType("System.String"))
dt.Columns.Add("FLOOR", Type.GetType("System.Int32"))
dt.Columns.Add("MEMO", Type.GetType("System.String"))

 

'DataTable の列と同じレコードを生成、及び、値の設定

 

'1 レコード目
row = dt.NewRow()
row("EMP-CD") = "001"
row("EMP_NAME") = "経理部"
row("FLOOR") = 1
row("MEMO") = String.Empty
dt.Rows.Add(row)

 

'2 レコード目
row = dt.NewRow()
row("EMP-CD") = "002"
row("EMP_NAME") = "営業部"
row("FLOOR") = 1
row("MEMO") = String.Empty
dt.Rows.Add(row)

 

'3 レコード目
row = dt.NewRow()
row("EMP-CD") = "003"
row("EMP_NAME") = "開発部"
row("FLOOR") = 1
row("MEMO") = String.Empty
dt.Rows.Add(row)


'DataGridView に DataTable の値を表示
GrdNormal.DataSource = dt

ここで気を付けてほしいのは、列名「EMP-CD」と「EMP_NAME」です。

列名「EMP-CD」は『ハイフン』です。

列名「EMP_NAME」は『アンダーライン』です。

また、実行すると下記のように 3 レコードのデータが表示されます。

f:id:middle-aged-se:20180818151644j:plain

 

続いて、SQL の Where 句のように、抽出したレコードに対して、更にフィルターをしてみましょう。

DataTable オブジェクト(変数 dt)には上記データがセットされているものとして、下記ソースコードを追加してください。

 

ソースコード 2

'変数の宣言
Dim dv As DataView = Nothing
Dim dtFilter As DataTable = Nothing

 

'作成した DatatTable に対する DataView を生成
dv = New DataView(dt)

 

'DataView を RowFilter で抽出
dv.RowFilter = "EMP_NAME = '開発部'"
dtFilter = dv.ToTable()

 

'DataGridView の RowFilter で抽出した値を表示
GrdFilder_OK.DataSource = dtFilter

実行すると、下記のように表示されます。

f:id:middle-aged-se:20180818151645j:plain

RowFilter プロパティに「EMP_NAME = '開発部'」をセットすることにより、『EMP_NAME列の値が「開発部」のものを抽出せよ』という動きになっています。

 

このように、RowFilter プロパティにフィルターする条件をセットすることにより、取得することが可能となります。

尚、複数条件を記載する場合は、「EMP_NAME = '開発部' AND FLOOR = 1」のように Where 句と似たように記載することで実現できます。

 

 
RowFilter プロパティ使用の注意点【超重要】

ここで、下記ソースコードを記載し、実行してみてください。

 

ソースコード 3

'変数の宣言
Dim dv As DataView = Nothing
Dim dtFilter As DataTable = Nothing

 

'作成した DatatTable に対する DataView を生成
dv = New DataView(dt)

 

'DataView を RowFilter で抽出
dv.RowFilter = "EMP-CD = '001'"
dtFilter = dv.ToTable()

 

'DataGridView の RowFilter で抽出した値を表示
GrdFilder_Err.DataSource = dtFilter

如何でしょうか?

実行できましたか??

結果は、実行した際に下記のような例外エラーが発生したと思います。

f:id:middle-aged-se:20180818151646j:plain

何故、このようなエラーになったかというと「列名に『-(ハイフン)』が記載されていたから」です。

では、使用する列名にどうしても『-(ハイフン)』を使用したい場合はどうすれば良いのでしょうか?

正解は「『[EMP-CD]』のように『中カッコ( [ ] )』で囲うです。

 

では、実際に下記ソースコードのように修正して実行してみてください。

修正内容は、RowFilter プロパティにセットする際、列名を『中カッコ([ ])』で囲っています

 

ソースコード 4

'変数の宣言
Dim dv As DataView = Nothing
Dim dtFilter As DataTable = Nothing

'作成した DatatTable に対する DataView を生成
dv = New DataView(dt)

'DataView を RowFilter で抽出
dv.RowFilter = "[EMP-CD] = '001'"   '[ ]で囲うとOK
dtFilter = dv.ToTable()

'DataGridView の RowFilter で抽出した値を表示
GrdFilder_Err.DataSource = dtFilter

実行すると、下記の通り表示されたと思います。

f:id:middle-aged-se:20180818151647j:plain

ですので、列名は必ず『中カッコ([ ])』で囲って使用しておけば間違いありませんね!

このように、DataTable のレコードを Where 句のように抽出する方法とは、DataView クラスの RowFilter プロパティを使用すれば可能ですので、皆さんも使ってみてくださいね!


Visual Basicの絵本 Windowsプログラミングわかる9つの扉


SQLの絵本 第2版 データベースが好きになる新しい9つの扉