トップ > Tech > CSharp > LINQ to SQL で SQL Server Compact を使う

LINQ to SQL で SQL Server Compact を使う

アプリ組み込み型のデータベースといえば、SQLiteが有名だと思うが、Visual Studio付属で比較的簡単に使えるSQL Server Compactというのもある。

機能や速度的にはSQLiteとあまり違いはないようである。 情報がきわめて少ないことが難点であるが、やねさんのページが参考になる。

※私はまさにここに書かれている「例えば、AutoIncrement(DB側でIdentifyプロパティが「はい」)になっていると、そのテーブルを更新できない。」という致命的欠陥にぶち当たった。

一応やりかたを再掲しておくと同時に、ちょっとハマったのでメモ。

準備

データベースの作成

ソリューションエクスプローラー → 追加 → ローカルデータベース

で.sdfファイルができるので、それをダブルクリック→サーバーエクスプローラーでテーブルを作成する。

ここではデータベースファイルの名前は"db.sdf"とした。

マッピングファイル(.dbml)の作成

SqlMetal.exeの位置確認

これには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ファイルをソリューションエクスプローラーにドロップすれば、プロジェクトに追加される。

LINQ to SQL によるデータベースへのアクセス

データファイルへのアクセスは下記のように指定すればよい。データコンテキストの"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でデータが追加されない

けっこうマヌケなトラブルだが、ハマった。

InsertOnSubmit→SubmitChangesをしてもサーバーエクスプローラーから確認できるテーブルのデータが増えていなかった。

なんでだろー、とけっこう長いこと調べていたが、米MSDNのフォーラムに同様の事態を発見。

考えてみたら当たり前だが、ソフトが起動中に編集(更新)されるファイルは"プロジェクト\*.sdf"ではなく、"プロジェクト\bin\Debug\*.sdf"である。サーバーエクスプローラーで見ているファイルは前者なので、ソフトからどれだけデータを追加したところで、反映されないわけである。

追加したデータを参照したい場合は、"bin\Debug"から上書きしてやればよい。

(2012/01/01 23:38:16)
12562
プロフィール

Kenz Yamada(山田研二)。1984年生。大阪。ちょっとずつ好きなプログラム作ってます。 好きなものはカメラと旅行。ガジェットや身の回り、ちょっとこだわります。 詳しくは Web mixi で。

Bookmark and Share