SQL Server Compact 4.0をWPFアプリケーションで使用する

 「Visual Studio 2010 SP1 Tools for SQL Server Compact 4.0」をインストールしても、データセットやEntity Data Modelのウィザードにおけるデータソースの一覧に「Microsoft SQL Server Compact 4.0」が表示されるのはASP.NETアプリケーションのプロジェクトに限られます。


 しかしながら、WindowsフォームやWPFといったWindowsアプリケーションでSQL Server Compact 4.0を使用することができないという訳ではありません。単純にVisual Studio 2010のウィザードのサポートがないというだけです。このことは、下記の奥主さんのblogに記載されています。

【SQL】 SQL Server Compact 4.0 に関するリリース情報 – Hiroshi Okunushi's Blog ☆ミ| IIS PHP etc.


4. Visual Studio 2010 SP1 Beta の VB あるいは C#Windows プロジェクトにおけるデザイナー :
Windows プロジェクト中の下記のウィザードは Compact 4.0 とともには動作しません。開発者は手動で ADO.NET provider for Compact 4.0 (System.Data.SqlServerCe) へのリファレンスを追加し、Windows プロジェクトにおいても Compact 4.0 向けに開発することは可能です。

    1. データセットを構成するための データソース構成ウィザード
    2. Sync Framework を使用して SQL Server とデータやスキーマを同期するための データ構成ウィザード
    3. Compact データベースからエンティティを生成するためのエンティティ モデル ウィザード



 逆に、SQL Server Compact 3.5はWindowsアプリケーションでのみ表示され、ASP.NETアプリケーションでは表示されません。しかしながら、3.5に関してはVisual Studioのウィザードのサポートだけでなく、ASP.NETアプリケーションにおける使用そのものがサポートされていません。

Managed Data Provider (SQL Server Compact)


 現在の SQL Server Compact 3.5 は、Web サイトに使用するデータベースとして最適化されていません。既定では、ASP.NET 接続アプリケーションからの接続は、SQL Server Compact 3.5 内でブロックされます。SQL Server Compact 3.5 は、アプリケーション内で組み込み型データベースとして使用するために最適化されています。SQL Server Compact 3.5 を Web サイト用のデータベースとして使用するには、複数ユーザーやデータの同時更新をサポートする必要があります。これにより、パフォーマンスに問題が発生する可能性があります。このため、これらの利用方法はサポートされていません。



 WPFアプリケーションでSQL Server Compact 4.0を使用する方法は以下の2つに分けられますが、今回は後者の方法でEntity Data Modelを使った場合を説明します。

  • WPFアプリケーションにSQL Server Compact 3.5を追加し、接続を確立した後でSQL Server Compact 4.0に差し替える。
  • 一旦ASP.NETアプリケーションでSQL Server Compact 4.0の接続を行い、生成されたファイルや設定をWPFアプリケーションにコピーする。


  1. お好きな種類のASP.NETアプリケーションプロジェクトを新規に作成し、[プロジェクト]の[新しい項目の追加]から「SQL Server Compact 4.0ローカルデータベース」を追加します(そうすることで自動的にApp_Dataフォルダにsdfファイルが追加されます)。
  2. [プロジェクト]の[新しい項目の追加]から「ADO.NET Entity Data Model」を追加し、[Entity Data Modelウィザード]で先ほど作成したsdfファイルを選択します。
  3. この時点でテーブルは作成していませんので、そのまま[完了]ボタンを押して空の状態のedmxファイルを生成します。
  4. WPFアプリケーションのプロジェクトを新規に作成し、[プロジェクト]の[既存項目の追加]から先ほどのASP.NETアプリケーションで作成したsdfファイルとedmxファイルを追加します。
  5. WPFアプリケーションのプロジェクトにプロジェクト]の[新しい項目の追加]から「アプリケーション構成ファイル」を追加します。
  6. ASP.NETアプリケーションのweb.configファイルに記載されているconnectionStrings部分をWPFアプリケーションの「アプリケーション構成ファイル」にコピーします(これ以降ASP.NETプロジェクトは使いませんので閉じてしまって構いません)。
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <connectionStrings>
        <add name="Database1Entities" connectionString="metadata=res://*/Model1.csdl|res://*/Model1.ssdl|res://*/Model1.msl;provider=System.Data.SqlServerCe.4.0;provider connection string=&quot;Data Source=|DataDirectory|\Database1.sdf&quot;" providerName="System.Data.EntityClient" />
      </connectionStrings>
    </configuration>
  7. データベースは空の状態なのでこの時点でテーブルを作成しておきます。
  8. WPFアプリケーションのプロジェクトで、[サーバーエクスプローラー]から[接続の追加]を行い[データソース]に「SQL Server Compact 4.0」、[データベース]に先ほどプロジェクトに追加したsdfファイルを選択します。
  9. そのまま[サーバーエクスプローラー]を使ってテーブルの作成を行います。
  10. データは作成したテーブルのコンテキストメニュー[テーブルデータの表示]から入力することができます。
  11. edmxファイルを開き、コンテキストメニューから[データベースからモデルを更新]を選択します。
  12. 先ほど作成したテーブルを選択し、[完了]ボタンを押します。
  13. MainWindow.xamlを開き、[データソース]ウィンドウから表示されているテーブルをデザイナ上にドラッグ&ドロップします。
  14. F5キーを押してデバッグ実行すると、SQL Server Compact 4.0のデータがDataGridに表示されることを確認できるはずです。






 なお、SQL Server Compactの接続文字列では、はデータベースのパスに|DataDirectory| という文字列が使用されています。このパスは既定では以下のようになっています。

  • Windowsアプリケーションの場合:アプリケーションの実行ファイルと同じフォルダ
  • WindowsアプリケーションをClickOnceで実行した場合:専用のデータフォルダ
  • Webアプリケーションの場合:App_Dataフォルダ


http://64.4.11.252/ja-jp/library/bb190958.aspx



 このパスは、アプリケーションドメインでDataDirectoryという名称のプロパティとして設定することで書き換えることが可能です。


C#

public partial class App : Application
{
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        AppDomain.CurrentDomain.SetData("DataDirectory", @"C:\Data");
    }
}