SQL Server Compact Edition 3.5の使い方


Windowsアプリでもちょっとしたデータの格納のためデータベースを使えると便利である。従来は、SQLiteなんかを使っていたと思うのだが、SQL Server Compact Edition 3.5(以下SQLSCe)という便利なものがあるので、今回はこれの使い方を解説する。


主な利点は
LINQで書ける
・テーブルをVisualStudioから簡単に編集できる
SQLiteと違って型がしっかりしている
など。


実行速度的には、SQLiteとそんなに変わらない。ものによってはSQLiteのほうが速いし、ものによってはSQLSCeのほうが速い。


主なデメリットは
・誰も使ってないので資料に乏しい
・制限が結構ある
・作り込みが足りない
など。


SQLSCeは大変便利なシロモノで、Windowsアプリ開発においては今後かなり重要な位置に来るものだと思うのだが、だぶん、多くの人は何をどうしていいかわからないと思うので、以下に資料をまとめておく。


■ LINQ to SQLを使え


LINQ to SQLはdiscon(開発終了)になるらしいので、普通はLINQ to Entitiesを使っていると思うのだが、SQLSCeではLINQ to Entitiesは使えない。いや、正確には、LINQ to EntitiesでもDBの参照は出来るのだが、制限が多すぎるので、LINQ to Entitiesは使ってはならない。


例えば、AutoIncrement(DB側でIdentifyプロパティが「はい」)になっていると、そのテーブルを更新できない。

SQL Server Compact を Entity Framework と共に使用する場合、以下の制限事項があります。


SQL Server Compact では、Entity Framework と共に使用する場合、サーバーで生成されたキーや値を持つエンティティはサポートされません。


http://technet.microsoft.com/ja-jp/library/cc835494.aspx

上の日本語は何が書いてあるのかいまひとつわからないが、AutoIncrementの値は「サーバーで生成された値」に該当するようだ。これが使えないとデータベースとして致命的だと思うのだが…。


そんなわけでLINQ to SQLを使うべし。


■ 導入


ソリューションエクスプローラーから「追加」→「ローカルデータベース」でデータベースを追加。追加されたファイルをダブルクリックするとサーバーエクスプローラーに切り替わる。あとはテーブルのところで右クリックしてテーブルの作成なり何なりすればいい。


ところが、ここで作成したテーブルを、LINQ to SQLのデザイナにドラッグしても「選択されたオブジェクトにはサポート外のデータプロバイダが使用されています。」というエラーが出てドラッグ出来ないんだな。


■ SQLMetal.exe


テーブルをドラッグするだけでコード書いてくれるんじゃなかったのかよ!と思うのだけど、SQLMetal.exeというプログラムを利用すれば、テーブルから、LINQ to SQLのファイル(拡張子は .dbml)を作成してくれる。


コード生成ツール (SqlMetal.exe)
http://msdn.microsoft.com/ja-jp/library/bb386987.aspx

SqlMetal コマンド ライン ツールは、.NET FrameworkLINQ to SQL コンポーネント用のコードとマッピングを生成します。このトピックで後述するオプションを適用することにより、次のようなアクションを SqlMetal で実行できます。

データベースから、ソース コードとマッピング属性またはマッピング ファイルを生成する。

データベースから、カスタマイズ用の中間的なデータベース マークアップ言語 (.dbml) ファイルを生成する。

.dbml ファイルから、コードとマッピング属性またはマッピング ファイルを生成する。

既定では、SQLMetal ファイルは drive:\Program Files\Microsoft SDKs\Windows\vn.nn\bin にあります。

そんなわけで、Windows SDKを落とすべし。


Windows SDK
http://www.microsoft.com/downloads/details.aspx?FamilyID=e6e1c3df-a74f-4207-8586-711ebe331cdc&DisplayLang=en


↓ちなみにこっちには入っていない。


Windows Vista および .NET Framework 3.0 ランタイム コンポーネント用 MicrosoftR Windows Software Development Kit
http://www.microsoft.com/downloads/details.aspx?FamilyID=7614FE22-8A64-4DFB-AA0C-DB53035F40A0&displaylang=ja



コマンドプロンプトを開いて、sdfファイルがあるフォルダに移動して、次のように入力するか、もしくはbatファイルに書いてしまおう。

"C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin\SqlMetal.exe" /dbml:DataClasses1.dbml Database1.sdf


これでdbmlに、sdfに入ってるテーブルの情報が書き込まれる。このdbmlファイルをVisualStudioのソリューションエクスプローラーで「追加」→「既存の項目」でプロジェクトに追加して、ダブルクリックしてデザイナで開くとDataClasses1.designer.cs にクラスが生成されて、使えるようになる。


■ サンプルプログラム


試しに以下のコードを書けば無事動く。



using (Database1 dc = new Database1("Data Source=Database1.sdf")) {
dc.会社.InsertOnSubmit(new 会社() { 社員名 = "ほげ" });
dc.会社.InsertOnSubmit(new 会社() { 社員名 = "もげ" });
dc.SubmitChanges();
foreach (var row in from r in dc.会社 select r) {
Console.WriteLine(row.社員番号 + ": " + row.社員名);
}
}

※ 上のプログラムではDBファイル名を指定しているが、これは、実行ファイルの起動したフォルダ相対ではなく、現在のカレントフォルダ相対になる。(カレントフォルダはファイルダイアログを開いて別のフォルダのファイルを選択すると変わってしまう) よって、ここは、Application.StartupPath + Path.PathSeparator + "データベースファイル名" のように指定したほうが無難。