フィルタリング

 DataTableオブジェクトに格納されているデータに対してフィルターをかけることができます。この機能により、特定の条件を満たす行のみを取り出すということができます。その時に利用するのがSelectメソッドです。引数に条件を指定します。結果としてDataRowオブジェクトの配列が返ってきます。

 例えば、Usersテーブルから「佐藤」という情報を持ったレコードを抽出するフィルターは次のように指定します。

[DataTable].Select("name = '佐藤'");

 SQL文でのWHERE句で指定する条件をSelectメソッドの引数としてセットすることで、フィルターをかけることができます。

○ プロジェクト

プロジェクトを作成して確認してみましょう。

プロジェクトの種類 コンソール アプリケーション
プロジェクト名 FilterTest

サンプルダウンロード

○ 作成の準備

 「DataRowTest」プロジェクトを修正して作成しましょう。DataRowTestフォルダーをコピーして、作成するプロジェクト名にフォルダー名を変更してください。

○ プログラム

 Mainメソッドを次のように修正してください。

Module1.vb

  1. Sub Main()
  2.  '接続文字列
  3.  Dim constr As String = "Data Source=(LocalDB)\v11.0;AttachDbFilename=C:\Work\Books.mdf;Integrated Security=True;Connect Timeout=30"
  4.  'SqlConnectionオブジェクトを生成
  5.  Dim con As SqlConnection = New SqlConnection(constr)
  6.  'Usersテーブルのデータを取得するSQL文を作成
  7.  Dim sql As String = "SELECT * FROM Users;"
  8.  'DataAdapterオブジェクトを生成
  9.  Dim da As New SqlDataAdapter(sql, con)
  10.  'DataTableオブジェクトを生成
  11.  Dim dt As New DataTable()
  12.  'DataTableとデータベースに同期させる
  13.  da.Fill(dt)
  14.  'フィルタリングするデータを入力する
  15.  Console.Write("表示したい名前:")
  16.  Dim name As String = Console.ReadLine()
  17.  'フィルタリングする
  18.  Dim drlist As DataRow() = dt.Select("name = '" + name + "'")
  19.  '検索結果を表示する
  20.  Console.WriteLine("検索結果")
  21.  If drlist.Length = 0 Then
  22.   Console.WriteLine("見つかりませんでした。")
  23.  Else
  24.   Console.WriteLine("Id : UserName : Password : Name")
  25.   For Each dr As DataRow In drlist
  26.    Console.WriteLine("{0} : {1} : {2} : {3}", dr("Id"), dr("UserName"), dr("Password"), dr("Name"))
  27.   Next
  28.  End If
  29.  Console.ReadLine()
  30. End Sub

○ 実行結果

表示したい名前:佐藤
検索結果
Id : UserName : Password : Name
1 : sato : spass : 佐藤

--------------------------------------------------------------------------------------------------------------------
表示したい名前:渡邊
検索結果
見つかりませんでした。

○ 解説

 29行目では、入力した氏名をもとにフィルターをSelectメソッドの引数として指定しています。フィルタリングの結果は1件でもDataRow配列として帰ってくるので、配列変数drlistを用意しています。

 フィルター条件によっては複数件結果が取得できるので、37~39行目でループ処理を指定しています。38行目でレコードを表示しています。

前へ   次へ