DataTableは、表形式つまり行と列を持っているデータ格納用の型です。
SQLを使って取得してきたデータ群を格納するためによく使われます。
サンプルデータ
今回、確認用に以下のデータを用意しました。
仮にこれをデータベースから取得してきたデータとします。
System.Data.DataTable dt = new System.Data.DataTable("SAMPLE");
//列を作成
dt.Columns.Add("ID", typeof(int));
dt.Columns.Add("NAME", typeof(string));
dt.Columns.Add("AGE", typeof(int));
dt.Columns.Add("GENDER", typeof(string));
//行を挿入
dt.Rows.Add(1, "鈴木 大介", 65, "男");
dt.Rows.Add(2, "佐々木 豊", 50, "男");
dt.Rows.Add(3, "松本 秀樹", 32, "男");
dt.Rows.Add(4, "田中 慎也", 47, "男");
dt.Rows.Add(5, "松本 健", 18, "男");
dt.Rows.Add(6, "高橋 勲", 50, "男");
dt.Rows.Add(7, "坂本 修", 64, "男");
dt.Rows.Add(8, "佐藤 望", 6, "男");
dt.Rows.Add(9, "山崎 純一", 11, "男");
dt.Rows.Add(10, "斉藤 亮太", 11, "男");
dt.Rows.Add(11, "池田 隆司", 17, "男");
dt.Rows.Add(12, "池田 晋", 27, "男");
dt.Rows.Add(13, "川上 勉", 33, "男");
dt.Rows.Add(14, "田村 均", 73, "男");
dt.Rows.Add(15, "菅原 大輔", 20, "男");
dt.Rows.Add(16, "甲斐 豊", 18, "男");
dt.Rows.Add(17, "吉野 陽介", 55, "男");
dt.Rows.Add(18, "小川 誠治", 50, "男");
dt.Rows.Add(19, "河野 大", 11, "男");
dt.Rows.Add(20, "高山 雄介", 51, "男");
dt.Rows.Add(21, "佐藤 典生", 58, "男");
dt.Rows.Add(22, "小林 舞", 36, "女");
dt.Rows.Add(23, "高橋 涼子", 55, "女");
dt.Rows.Add(24, "高橋 葵", 42, "女");
dt.Rows.Add(25, "伊藤 彩子", 7, "女");
dt.Rows.Add(26, "藤井 あゆみ", 35, "女");
dt.Rows.Add(27, "齋藤 恵美", 74, "女");
dt.Rows.Add(28, "山田 泉", 15, "女");
dt.Rows.Add(29, "三浦 裕美", 7, "女");
dt.Rows.Add(30, "中村 英子", 14, "女");
dt.Rows.Add(31, "藤田 亜紀", 43, "女");
dt.Rows.Add(32, "石田 綾香", 36, "女");
dt.Rows.Add(33, "西村 香", 46, "女");
dt.Rows.Add(34, "小川 慶子", 64, "女");
dt.Rows.Add(35, "竹内 浩子", 50, "女");
dt.Rows.Add(36, "藤田 香奈", 69, "女");
dt.Rows.Add(37, "石橋 絵美", 55, "女");
dt.Rows.Add(38, "伊藤 幸奈", 7, "女");
dt.Rows.Add(39, "藤井 志織", 56, "女");
dt.Rows.Add(40, "林 文香", 64, "女");
dt.Rows.Add(41, "大原 朋子", 35, "女");
dt.Rows.Add(42, "江藤 恵子", 29, "女");
dt.Rows.Add(43, "植木 明子", 38, "女");
dt.Rows.Add(44, "伊藤 朋実", 28, "女");
dt.Rows.Add(45, "山田 静江", 38, "女");
dt.Rows.Add(46, "岡村 瑠美", 46, "女");
dt.Rows.Add(47, "山本 公恵", 9, "女");
dt.Rows.Add(48, "水野 依子", 36, "女");
dt.Rows.Add(49, "和田 絵梨子", 66, "女");
dt.Rows.Add(50, "大野 寿美子", 47, "女");
dt.Rows.Add(51, "武田 奈未", 61, "女");
dt.Rows.Add(52, "近藤 栄", 49, "女");
dt.Rows.Add(53, "黒木 京子", 72, "女");
dt.Rows.Add(54, "大野 舞美", 63, "女");
dt.Rows.Add(55, "谷山 綾乃", 21, "女");
dt.Rows.Add(56, "池本 妙子", 8, "女");
dt.Rows.Add(57, "中澤 憲子", 19, "女");
dt.Rows.Add(58, "松下 知加", 28, "女");
dt.Rows.Add(59, "沓掛 由美", 55, "女");
dt.Rows.Add(60, "梁 恵理", 48, "女");
dt.Rows.Add(61, "塩原 あずさ", 15, "女");
dt.Rows.Add(62, "牧内 亜希子", 14, "女");
dt.Rows.Add(63, "笠井 明恵", 71, "女");
dt.Rows.Add(64, "林 未世", 45, "女");
dt.Rows.Add(65, "柴野 優希", 28, "女");
dt.Rows.Add(66, "清水 峰代", 54, "女");
dt.Rows.Add(67, "平川 祐奈", 34, "女");
dt.Rows.Add(68, "酒井 ねこ", 75, "女");
dt.Rows.Add(69, "露木 由理", 16, "女");
dt.Rows.Add(70, "片岡 絢野", 32, "女");
dt.Rows.Add(71, "要 佐知子", 57, "女");
dt.Rows.Add(72, "廣瀬 塔子", 63, "女");
dt.Rows.Add(73, "佐鳥 友紀", 30, "女");
dt.Rows.Add(74, "有坂 三奈", 70, "女");
dt.Rows.Add(75, "仙波 由紀美", 6, "女");
dt.Rows.Add(76, "森安 文枝", 62, "女");
dt.Rows.Add(77, "熊谷 千香子", 35, "女");
dt.Rows.Add(78, "立山 うらら", 68, "女");
dt.Rows.Add(79, "行本 美彩", 29, "女");
dt.Rows.Add(80, "居川 英理子", 70, "女");
Selectを使って抽出する
例えば、サンプルデータの中から50歳以上の人を抽出する場合は、以下のように書きます。
DataRow[] rows = dt.Select("AGE >= 50");
条件式はSQLのWhere文のように書けばよいです。
出力結果は以下のようになります。

取得したDataRowの配列をDataGirdViewに表示してみました。ここで一つ気になります。
並びが年齢順になっています。どうやら比較対象に対して自動でソートしてしまっているようです。
抽出結果に対してソートを行う
抽出結果を年齢の高い順で、ID順に並び替えたいとします。
Selectの第2引数がsortになっているので、以下のように書きます。
DataRow[] rows = dt.Select("AGE >= 50", "AGE desc, id asc");
ソートの部分もSQLのorder byのように書けば大丈夫です。descは逆順, ascは正順分もSQLのorder byのように書けば大丈夫です。descは逆順, ascは正順になります。
実行結果は以下の通り

まとめ
一度、取得したデータを再利用することは大事です。データベースからデータを何度も取得する場合、ネットワークを介するためあまり早いとは言えません。
データベースサーバーへの負荷もかかるため、速度面も考慮し再利用できるならそれで行うほうが、有効なことは多いです。


コメント