SQL Server Compact が単体で動くのかを調べるのと同時に、ちょっと不思議だったのが WebMatrix のデータベース接続です。自動生成される Raizor のソースを見る限り LINQ で接続しているわけでもないし、どういう風に表示しているのかな、と思っていたのですが。具体的には、WebMatrix.Data.dll という WebMatrix 付属のデータアクセスコンポーネントを使っています。
webmatrix を起動して、ベーカリーのテンプレートで自動生成して、Default.cshtml を開くと、
1 2 3 4 5 6 7 8 9 | @{ Page.Title = "Home" ; var db = Database.Open( "bakery" ); var products = db.Query( "SELECT * FROM PRODUCTS" ).ToList(); var featured = products[ new Random().Next(products.Count)]; } <h1>Welcome to Fourth Coffee!</h1> |
のようなコードがあります。
この「Database.Open」のところでデータベースへの接続、「db.Query」でクエリの実行、ってことが想像できます。
MSDN 上のヘルプはこちら、Database.Open Method (WebMatrix.Data)
■windows アプリで webmarix.data.dll を使う
ならば、web 上の webmatrix じゃなくて、windows form でも使えるのでは?と思って試しに接続してみました。
1.先のテンプレートサイトの bin フォルダにある webmatrix.data.dll を参照設定
2.app_data/bakery.sdf を windows プロジェクトにコピー
3.「using WebMatrix.Data;」を追加
4. コードを記述
1 2 3 4 5 6 7 | string CNSTR = "app_data\\bakery" ; private void button1_Click( object sender, EventArgs e) { var db = Database.Open(CNSTR); var products = db.Query( "SELECT * FROM PRODUCTS" ).ToList(); dataGridView1.DataSource = products; } |
接続文字列…というか、Openメソッドに渡す string は comapct のデータファイルそのものです。実行ファイルのカレントディレクトリから参照されるようなので、”app_data\\bakery” を渡しておきます。同じフォルダにある場合は “bakery” だけでも ok です。
こうすると、さっくりと実行できます。
まあ、windows フォームなんだから LINQ to Entities を使えばよいし、SQL 文を直接記述したい場合には SqlCommand や SqlDataAdapter を使えばよいので、あまりメリットはないのですが、さっくりと接続したときには便利…かもしれませんね。
■ちなみに、webmatrix.data.dll と *.exe だけで動くのか?
と、肝心なことを。
この webmatrix.data.dll と *.exe 、*.sdf(データベースファイル)を windows 7 のコンピュータにコピーするだけで動作するのかどうか?、と試してみたのですが駄目でした。別途、「sql server compact edition」のインストールが必要になります。SQL Server の express edition を入れるよりは軽いとはいえ、インストールしないと使えないのはなぁ、という懸念が。
こうなると、データファイルをコピーするだけで動作可能(他のセッティングが不要)なのは、
- SQLite(未検証)
- Access
ってところですかね。XML ファイルを用意して、linq to xml で検索することも可能なのですが、ガッツリ読み込んでしまうので、でかいファイル(100MBのファイルとか)はちょっとなぁという感じがするのです。もっとも、それだけ大きくなると、access では駄目なような気もしますが。これは要検証ということで。
You can always tell an expert! Thanks for cogbtiturinn.