Ruby on Railsをかじってたときに、SQLiteという超手軽なデータベースがあるのは知ってたけど、.NETにゃ~あまり関係ないかと思ってました。でも、調べてみると、SQLiteをC#で書き直したという素晴らしいものがあるということに先日気づきました。
参考にしたサイト
ということで、上記サイトに一通り目を通したので、本家を見ながらやってみようと思います。
ダウンロード~インストール
以下のサイトから、最新のSQLite for ADO.NET 2.0をダウンロードします。
本家サイト
http://sqlite.phxsoftware.com/
色々あったのですが、ここではSQLite-1.0.61.0-binaries.zipをダウンロードしました。
展開すると、2つのフォルダと1つのhtmファイルが出来ます
bin/Designer/install.exeをダブルクリックすると、以下のような画面が表示されるので、チェックをつけてCloseを押します。(さくっと終わるので、本当にインストールされているのか不安になりますが出来てます)
Express Editionを使ってる人は注意!!
Express Editionを使ってる人には、以下の制約があります。(因みに私の環境はVS2008 std SP1です)
All Express Editions (except Visual Web Developer) are hard-coded to only allow you to design for Jet and Sql Server Database Files. The only way for SQLite to install its designer is to temporarily replace one of the existing "approved" designers. Therefore, when you install the SQLite designer for one of these express editions, it will temporarily replace the Microsoft Access designer. You can revert back to the Access designer simply by re-running the install.exe program and un-checking the boxes.
Excite翻訳様に聞いた感じだと、Express Editionの場合はAccessのデザイナーをSQLiteのデザイナーに置き換えてしまうことで、Express Editionでも使えるようにしたらしいです。チェックを外すとAccessのデザイナーに戻すことが出来ます。
コンソールアプリケーションでお試し
デザイン時のサポートをインストールしたら「SQLiteSample」という名前でコンソールアプリケーションを作ります。
参照の追加から、System.Data.SQLiteを追加します。(下にSystem.Data.SQLite.Linqという気になるものがあるけどここでは追加しないです)
そして、コネクションを開いて閉じるだけの小さなサンプルを作ります。
using System.Data.SQLite;
namespace SQLiteSample
{
class Program
{
static void Main(string[] args)
{
// コネクションを開いて閉じるだけ
using (var conn = new SQLiteConnection("Data Source=Test.db"))
{
conn.Open();
conn.Close();
}
}
}
}
System.Data.SQLiteの接続文字列は、「Data Source=DBファイル名」というとてもシンプル設計になっています。
これを実行して、プロジェクトの下のbin/Debugを見てみると、Test.dbというファイルが作成されます。これがSQLiteのファイルになります。
テーブルを作ろう
SQLiteのコネクションを開いて閉じるだけで、勝手にDBファイルが作られることが確認できました。世間のサンプルを見渡してると、そこからCREATE TABLEとかをしてINSERT, SELECT, UPDATE, DELETEをしているものをよく見かけます。
なので、ここでは、SQLiteのデザイン時サポート機能を使ってテーブルを作っていきます!!
サーバーエクスプローラから接続の追加を選択します。
SQLite Database Fileを選択します。
新しくDBを作成したいのでNewボタンを押します。
プロジェクト直下に「Test.db」を作成するようにします。
テスト接続に成功したら、OKを押して完了します。そうすると、サーバーエクスプローラにSQLite[Test]というものが追加されます。
この状態だと、プロジェクトにTest.dbファイルは追加されていないので、上記手順で新規に作成したTest.dbファイルを既存の項目を追加から、プロジェクトに追加します。
追加したら、出力ディレクトリにコピーの部分を「新しい場合はコピーする」に変更します。
次にテーブルを作っていきます。サーバーエクスプローラに戻ってTablesの所で右クリックをして、新しいテーブルの追加を選択します。
まだ、開発中の機能だからバグがあったら教えてね!というメッセージが表示されるのでOKを押します。
SQL Serverのテーブルを作成するのと、同じ感じのUIなので戸惑うことなく使えます。
Personという名前で、列はID: integer(primary key), Name: nvarchar(50), Age: integerの3つを持ったテーブルを作成します。
Tablesの下にPersonテーブルが追加されるので、右クリックメニューから「データの取得」を選択します。
テーブルのデータが表示されます。下のようにデータを打ち込むこともできます。
プログラムから読もう
テーブルも出来たので、データを読み込んでみようと思います。
プロジェクトにTestDataSetという名前でDataSetを追加します。
DataSetのデザイナにサーバーエクスプローラのPersonテーブルをドラッグアンドドロップします。
SQL Serverの時と同じようにTableAdapterが出来ます!
Mainに、さっきかいた接続するだけのプログラムをさくっと消してTableAdapterを使ってデータをとってくるコードを書きます。
using System;
using SQLiteSample.TestDataSetTableAdapters;
namespace SQLiteSample
{
class Program
{
static void Main(string[] args)
{
var ta = new PersonTableAdapter();
var people = ta.GetData();
foreach (TestDataSet.PersonRow row in people.Rows)
{
Console.WriteLine("{0}, {1}, {2}",
row.ID, row.Name, row.Age);
}
}
}
}
実行すると、先ほどデザイナを使ってテーブルに入れたデータが取れているのがわかります。
更新も出来るか確認してみます。
using System;
using SQLiteSample.TestDataSetTableAdapters;
namespace SQLiteSample
{
class Program
{
static void Main(string[] args)
{
var ta = new PersonTableAdapter();
var people = ta.GetData();
foreach (TestDataSet.PersonRow row in people.Rows)
{
Console.WriteLine("{0}, {1}, {2}",
row.ID, row.Name, row.Age);
}
// 田中 一郎さんの年齢を更新
people[2].Age = 44;
ta.Update(people);
// 再取得
people = ta.GetData();
// もう一回データを表示
Console.WriteLine("=================");
foreach (TestDataSet.PersonRow row in people.Rows)
{
Console.WriteLine("{0}, {1}, {2}",
row.ID, row.Name, row.Age);
}
}
}
}
ばっちり更新できています。
追加もしてみます。さっきのプログラムに続けて以下のコードを追加します。
// 五郎さんを追加して
people.AddPersonRow(4, "田中 五郎", 89);
ta.Update(people);
// データをDBから再取得
people = ta.GetData();
// もう一回データを表示
Console.WriteLine("=================");
foreach (TestDataSet.PersonRow row in people.Rows)
{
Console.WriteLine("{0}, {1}, {2}",
row.ID, row.Name, row.Age);
}
実行すると、五郎さんが追加されているのがわかります。
Insertのコードは2回実行すると失敗するのでコメントアウトして、次にDeleteの処理を書いて見ます。
// 3番目の人を消して
people.RemovePersonRow(people[2]);
// 更新
ta.Update(people);
// もう一回データを表示
Console.WriteLine("=================");
foreach (TestDataSet.PersonRow row in people.Rows)
{
Console.WriteLine("{0}, {1}, {2}",
row.ID, row.Name, row.Age);
}
実行すると、ばっちり3番目の人が消えてることがわかります。
まとめ
これはなかなかいいものだ!!