アプリ組み込み型のデータベースといえば、SQLiteが有名だと思うが、Visual Studio付属で比較的簡単に使えるSQL Server Compactというのもある。
機能や速度的にはSQLiteとあまり違いはないようである。 情報がきわめて少ないことが難点であるが、やねさんのページが参考になる。
※私はまさにここに書かれている「例えば、AutoIncrement(DB側でIdentifyプロパティが「はい」)になっていると、そのテーブルを更新できない。」という致命的欠陥にぶち当たった。
一応やりかたを再掲しておくと同時に、ちょっとハマったのでメモ。
ソリューションエクスプローラー → 追加 → ローカルデータベース
で.sdfファイルができるので、それをダブルクリック→サーバーエクスプローラーでテーブルを作成する。
ここではデータベースファイルの名前は"db.sdf"とした。
これにはSQLMetal.exeというツールを使う。やねさんのところにはWinSDKをダウンロードする旨書いてあったが、私の環境(Win7 x64 + VS 2010 Ultimate)では、下記のフォルダに存在したので、そのまま利用した。
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\SqlMetal.exe
なければ、やねさんのとこの情報に従って入手しよう。
プロジェクトのフォルダ(.sdfがあるフォルダ)に適当なバッチファイル(たとえば"sdf2dbml.bat"など)を作る。
"C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\SqlMetal.exe" /dbml:db.dbml db.sdf
このファイルをダブルクリックして実行すれば、db.dbmlが同じフォルダにできるはずである。 この.dbmlファイルをソリューションエクスプローラーにドロップすれば、プロジェクトに追加される。
データファイルへのアクセスは下記のように指定すればよい。データコンテキストの"Db"というクラス名は、元のデータベースファイル名を大文字にしたものになるらしい。db.dbml → Db
using (Db db = new Db("Data Source=ファイルパス"))
{
db.Table1.InsertOnSubmit(new Table1() { Column1 = "データ1" });
db.Log = Console.Out; // ログ出力
db.SubmitChanges(); // データベースに反映
foreach (var row in from r in db.Table1 select r)
{
Console.WriteLine(row.Column1);
}
}
ファイルパスには、絶対パスを指定したほうが無難なので、下記のようにする。
WindowsアプリならApplication.StartupPathで簡単。
Application.StartupPath + "\\db.sdf"
WPFだとApplication.StartupPathが使えないので、Path.GetDirectoryNameを使う。
Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]) + "\\db.sdf"
けっこうマヌケなトラブルだが、ハマった。
InsertOnSubmit→SubmitChangesをしてもサーバーエクスプローラーから確認できるテーブルのデータが増えていなかった。
なんでだろー、とけっこう長いこと調べていたが、米MSDNのフォーラムに同様の事態を発見。
考えてみたら当たり前だが、ソフトが起動中に編集(更新)されるファイルは"プロジェクト\*.sdf"ではなく、"プロジェクト\bin\Debug\*.sdf"である。サーバーエクスプローラーで見ているファイルは前者なので、ソフトからどれだけデータを追加したところで、反映されないわけである。
追加したデータを参照したい場合は、"bin\Debug"から上書きしてやればよい。
Kenz Yamada(山田研二)。1984年生。大阪。ちょっとずつ好きなプログラム作ってます。
好きなものはカメラと旅行。ガジェットや身の回り、ちょっとこだわります。
詳しくは Web mixi で。