インストール不要!DataTableでデータベースを使ってみよう。
こんにちは、ノムノムです。
今回は、データベースについてやっていこうと思うのですが、一般的にデータベースというとSQL SERVERやOracle、MySQL、PostgreSQL、Accessが有名ですね。
これらはC#とは直接関係なく別のツールとして利用し、C#からはアダプター(adapter)を使ってそれらから情報を取得して利用します。
とは言っても個人利用するだけでの開発であれば、そんな環境を準備するのは面倒くさいです。
今回は、DataTableクラスを使ってデータベースを扱ってみたいと思います。
データベースとは
データベースとは検索、追加、更新、削除をしやすいように整理されたデータ群のことを指します。
身の回りにデータベースは多数存在します。身近なところで言えば会員カードですね。カードを作るときに名前、住所、電話番号など様々な情報を紙に記入したと思います。
これらの情報を管理するのがデータベースです。
データベース化されていれば、例えば山田さんという名前の人だけ検索するといったことも簡単にできます。
もちろんお店でのポイント管理もデータベースでできますね。
ここまで説明するとピンとくるかたもいるかもしれません。
データベースってExcelの表に似ているんです。
つまりデータべースには行と列があります。
列が項目を表し、行番号で行を表します。
DataTableクラス
.Net FrameWorkには簡易的にデータベースを扱うためのクラスDataTableがあります。
先ほど述べた通り行と列がありそれぞれ追加、更新、削除、検索が行えます。
意外と便利なのがデータベースの内容をXMLで出力/読込できることです。
実際にやってみましょう。
//テーブルクラスの宣言とインスタンスの作成
DataTable tbl = new DataTable("TABLE_NAME");
//列を指定
tbl.Columns.Add("FIRST_NAME");
tbl.Columns.Add("LAST_NAME");
tbl.Columns.Add("ADDRESS");
tbl.Columns.Add("TEL");
//行の追加
tbl.Rows.Add("山田", "太郎", "東京都XXX区XXX1-1", "090-XXXX-XXX1");
tbl.Rows.Add("渡辺", "一郎", "北海道XXX区XXX2-1", "090-XXXX-XXX2");
tbl.Rows.Add("鈴木", "次郎", "大阪府XXX区XXX3-1", "090-XXXX-XXX3");
tbl.Rows.Add("山田", "三郎", "愛知県XXX区XXX4-1", "090-XXXX-XXX4");
まずテーブルクラスを宣言しインスタンスを作成します。この時、テーブル名(TABLE_NAME)を決めてしまいます。テーブル名は任意の名前です。わかりやすい名前にするといいでしょう。
次に列(Columns)の指定データベースにどのような項目を持たせるか指定します。今回は「FIRST_NAME」(苗字)、「LAST_NAME」(名前)、「ADDRESS」(住所)、「TEL」(電話番号)にしました。
行(Rows)の追加では、指定した項目に沿った内容を追加します。
作成したデータベースをDataGridViewに表示する。
データベースを画面に表示してみましょう。オススメはDataGridViewコントロールです。
DataGridViewコントロールのDataSourceプロパティにDataTableをセットするだけで表示できます。
//DataGridViewに表示
this.dataGridView1.DataSource = tbl;
そうすると以下のようになります。

便利ですね。ちなみにヘッダーの表示は以下のようにすると変えられます。
this.dataGridView1.Columns[0].HeaderText = "苗字";
this.dataGridView1.Columns[1].HeaderText = "名前";
this.dataGridView1.Columns[2].HeaderText = "住所";
this.dataGridView1.Columns[3].HeaderText = "電話番号";

データベースを検索をする
データベースの検索はSelectメソッドを利用します。
山田さんを検索してみましょう

//検索
DataRow[] rows = tbl.Select("FIRST_NAME = '" + this.txtFind.Text.Trim() + "'", "ADDRESS");
//表示用文字列を作成
StringBuilder mes = new StringBuilder();
foreach(DataRow row in rows)
{
mes.Append(row["FIRST_NAME"] + " ");
mes.Append(row["LAST_NAME"] + " ");
mes.Append(row["ADDRESS"] + " ");
mes.Append(row["TEL"]);
mes.AppendLine();
}
//表示
MessageBox.Show(mes.ToString());
Selectメソッドの第一引数で検索条件を設定します。この場合「FIRST_NAME 」がテキストコントロール入力値(山田)の行だけ取得します。
第二引数では並び順(ソート)を指定します。この場合、「ADDRESS」順にしています。
DataRowはデータを格納している行のことです。
DataTableクラスのRowsはDataRowCollectionクラスですのでRowsの中から対象の行のみをADDRESS順に配列にして渡してくれるということです。
これを実行すると以下のようになります。

行を追加する
行の追加は、最初に記載した通りAddメソッドでできます。
tbl.Rows.Add("山田", "太郎", "東京都XXX区XXX1-1", "090-XXXX-XXX1");
もう一つ追加する方法があります。それはNewRowメソッドを使う方法です。
//新規行の作成
DataRow row = tbl.NewRow();
//追加する内容を設定
row["FIRST_NAME"] = "鈴木";
row["LAST_NAME"] = "史郎";
row["ADDRESS"] = "福岡県XXXX市XX区5-8-1";
row["TEL"] = "090-XXXX-XXX5";
//行の追加
tbl.Rows.Add(row);
NewRowメソッドは、新しい行の情報をコピーします。つまり列の情報をもった行を新しく作るということです。NewRowメソッドを実行した段ではまだ行は追加されていません。
追加する内容を設定し、Rows.Addメソッドに行を渡すことでデータテーブルに反映します。

データを更新する
データを変更したい場合、変更したい行番号と列名または列番号がわかれば簡単に変更できます。
例でいくと渡辺さんを後藤さんに変えたいとします。
tbl.Rows[1]["FIRST_NAME"] = "後藤";

ポイントはどうやって渡辺さんの行を取得するかです。
以下のような方法が実用的ですね
//検索
DataRow[] rows = tbl.Select("FIRST_NAME = '渡辺' and TEL = '090-XXXX-XXX2'", "ADDRESS");
//更新
foreach (DataRow row in rows)
{
row["FIRST_NAME"] = "後藤";
}
行を削除する
行を削除したい時は、削除したい行インデックスまたは、削除したい行のDataRowオブジェクトがあれば削除できます。
tbl.Rows.RemoveAt(0);
もしくは
DataRow row = tbl.Rows[0];
tbl.Rows.Remove(row);
やはりポイントは削除したい行の位置をどうやって取得するかです。
山田太郎さんだけ削除したい場合は、以下のようにやったらどうでしょうか
//検索
DataRow[] rows = tbl.Select("FIRST_NAME = '山田' and LAST_NAME = '太郎' and TEL = '090-XXXX-XXX1'", "ADDRESS");
//更新
foreach (DataRow row in rows)
{
tbl.Rows.Remove(row);
break;
}
これを実行すると以下のようになります。

データベースを保存する
データベースを保存するには簡単です。
tbl.WriteXml(path);
これだけです。変数pathには保存するファイルのパスをセットします。
実行するとXMLができてデータベースの内容が書き込まれています。
<?xml version="1.0" standalone="yes"?>
<DocumentElement>
<TABLE_NAME>
<FIRST_NAME>山田</FIRST_NAME>
<LAST_NAME>太郎</LAST_NAME>
<ADDRESS>東京都XXX区XXX1-1</ADDRESS>
<TEL>090-XXXX-XXX1</TEL>
</TABLE_NAME>
<TABLE_NAME>
<FIRST_NAME>渡辺</FIRST_NAME>
<LAST_NAME>一郎</LAST_NAME>
<ADDRESS>北海道XXX区XXX2-1</ADDRESS>
<TEL>090-XXXX-XXX2</TEL>
</TABLE_NAME>
<TABLE_NAME>
<FIRST_NAME>鈴木</FIRST_NAME>
<LAST_NAME>次郎</LAST_NAME>
<ADDRESS>大阪府XXX区XXX3-1</ADDRESS>
<TEL>090-XXXX-XXX3</TEL>
</TABLE_NAME>
<TABLE_NAME>
<FIRST_NAME>山田</FIRST_NAME>
<LAST_NAME>三郎</LAST_NAME>
<ADDRESS>愛知県XXX区XXX4-1</ADDRESS>
<TEL>090-XXXX-XXX4</TEL>
</TABLE_NAME>
</DocumentElement>
データベースを読込む
データベースの読み込みも保存同様に簡単です
tbl.ReadXml(path);
こちらも、変数pathに読み込むファイルのパスをセットします。
注意する点があります。読み込むデータベースとプログラムのデータテーブルの構造が同じでなければいけません。
つまり今回の場合は、テーブル名が「TABLE_NAME」で項目が「FIRST_NAME」、「LAST_NAME」、「ADDRESS」、「TEL」でなければ読込は失敗します。
まとめ
DataGridViewコントロールのDataSourceプロパティにDataTableを渡すと画面の変更で直接DataTableの中身を追加、更新、削除できます。
ただそれでは困る場面もでてきます。そういう場合はDataGirdViewコントロールのプロパティを設定して変更できないようにするのがいいでしょう。
データベースを扱えると情報の管理が簡単にできてとっても便利です。
データベースを使ったプログラミングは、業務でもよく使います。
例えば、顧客管理システムや在庫管理システム、勤怠管理システムなどたくさんの情報扱うような場合必須になってきます。
プライベートでデータの蓄積など行いたい場合もよく使いますのでぜひ覚えて頂きたいものの一つです。
ここまで読んで頂きありがとうございます。