フィルタリング

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

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

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

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

○ プロジェクト

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

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

サンプルダウンロード

○ 作成の準備

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

○ プログラム

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

Program.cs

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

○ 実行結果

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

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

○ 解説

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

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

前へ   次へ