システム開発で欠かせないのが、データベースですよね。
以前、DataTable クラスを使用して Distinct(重複行の除外)する方法をご紹介しました。
今回は、SQL の Where 句のように、抽出したレコードに対して、更に条件を用いて抽出する(フィルターする)方法をご紹介します!
DataView クラスの RowFilter プロパティで実現可能!
SQL の Where 句のように、抽出したレコードに対して、更にフィルターする場合は、DataView クラスの RowFilter プロパティを使用することにより、実現可能です!
では、サンプルプログラムを使って見ていきましょう!
尚、フォームには DataGridView コントロール(GrdNormal、GrdFilder_OK と GrdFilder_Err)を 3 つ追加してあります。
下記ソースコードで、DataTable オブジェクト(変数 dt)にデータがセットされていることを前提に説明していきますね。
'変数の宣言
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 レコードのデータが表示されます。
続いて、SQL の Where 句のように、抽出したレコードに対して、更にフィルターをしてみましょう。
DataTable オブジェクト(変数 dt)には上記データがセットされているものとして、下記ソースコードを追加してください。
'変数の宣言
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
実行すると、下記のように表示されます。
RowFilter プロパティに「EMP_NAME = '開発部'」をセットすることにより、『EMP_NAME列の値が「開発部」のものを抽出せよ』という動きになっています。
このように、RowFilter プロパティにフィルターする条件をセットすることにより、取得することが可能となります。
尚、複数条件を記載する場合は、「EMP_NAME = '開発部' AND FLOOR = 1」のように Where 句と似たように記載することで実現できます。
RowFilter プロパティ使用の注意点【超重要】
ここで、下記ソースコードを記載し、実行してみてください。
'変数の宣言
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
如何でしょうか?
実行できましたか??
結果は、実行した際に下記のような例外エラーが発生したと思います。
何故、このようなエラーになったかというと「列名に『-(ハイフン)』が記載されていたから」です。
では、使用する列名にどうしても『-(ハイフン)』を使用したい場合はどうすれば良いのでしょうか?
正解は「『[EMP-CD]』のように『中カッコ( [ ] )』で囲う」です。
では、実際に下記ソースコードのように修正して実行してみてください。
修正内容は、RowFilter プロパティにセットする際、列名を『中カッコ([ ])』で囲っています。
'変数の宣言
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
実行すると、下記の通り表示されたと思います。
ですので、列名は必ず『中カッコ([ ])』で囲って使用しておけば間違いありませんね!
このように、DataTable のレコードを Where 句のように抽出する方法とは、DataView クラスの RowFilter プロパティを使用すれば可能ですので、皆さんも使ってみてくださいね!