チュートリアル : ローカル データベース キャッシュを n 層アプリケーションに追加する
更新 : 2007 年 11 月
Visual Studio における ローカル データベース キャッシュ とは、Microsoft Synchronization Services for ADO.NET を使用してリモート データベースとの間でデータを同期するために構成された SQL Server Compact 3.5 データベースです。このチュートリアルでは、「チュートリアル : n 層データ アプリケーションの作成」のトピックで作成したアプリケーションに SQL Server Compact 3.5 データベースを追加する方法の詳細な手順について説明します。
このチュートリアルでは、次のタスクを実行する方法を学習します。
ローカル データベース キャッシュ項目をプロジェクトに追加する。
データ同期を構成する。
同期操作を既存のデータ サービスに組み込む。
ローカル データベース キャッシュから Customers テーブルを取得するために、データをロードするコードを変更する。
同期処理を開始するコードを追加する。
前提条件
このチュートリアルを完了するには、次の条件が必要です。
「チュートリアル : n 層データ アプリケーションの作成」で作成したソリューションおよび関連するプロジェクト。
Northwind サンプル データベースへのアクセス許可。詳細については、「方法 : サンプル データベースをインストールする」を参照してください。
メモ : |
---|
お使いのマシンで、Visual Studio ユーザー インターフェイスの一部の要素の名前や場所が、次の手順とは異なる場合があります。これらの要素は、使用している Visual Studio のエディションや独自の設定によって決まります。詳細については、「Visual Studio の設定」を参照してください。 |
NTierWalkthrough ソリューションを開く
NTierWalkthrough ソリューションを開くには
[ファイル] メニューの [開く] をポイントし、[プロジェクト/ソリューション] をクリックして、NTierWalkthrough.sln ファイルの場所に移動します。
メモ : NTierWalkthrough.sln ファイルは「チュートリアル : n 層データ アプリケーションの作成」トピックで作成するもので、このチュートリアルを実行するための前提条件となります。まだ行っていない場合は、「チュートリアル : n 層データ アプリケーションの作成」トピックを完了し、終了時にすべてのプロジェクトを保存してください。
ローカル データベース キャッシュを NTierWalkthrough に追加する
ローカル データベース キャッシュは、クライアントに配置されている SQL Server Compact 3.5 データベースであるため、ローカル データベース キャッシュの追加先は PresentationTier プロジェクトになります。このチュートリアルでは Customers テーブルをキャッシュに入れる方法を取り上げることから、このローカル データベース キャッシュには CustomersCache という名前を付けます。
メモ : |
---|
このチュートリアルでは、Customers テーブルだけを使用するため、ローカル データベース キャッシュの名前を CustomersCache にしますが、1 つのローカル データベース キャッシュに複数のテーブルを追加することも可能です。 |
プレゼンテーション層にローカル データ キャッシュを追加するには
ソリューション エクスプローラで、PresentationTier を右クリックし、[新しい項目の追加] をクリックします。
[ローカル データベース キャッシュ] テンプレートをクリックします。
[名前] に CustomersCache と入力します。
[追加] をクリックします。
[データ同期の構成] ダイアログ ボックスが開きます。
データ同期の構成
データ同期を構成するには、サーバーへのデータ接続を選択し、アプリケーションでローカル キャッシュに追加するテーブルを選択します。このチュートリアルでは、サーバー接続を SQL Server バージョンの Northwind データベースに設定し、Customers テーブルをローカル キャッシュに追加します。さらに、ローカル データベース キャッシュを n 層アプリケーションに追加するため、詳細オプションを設定して、別個のプロジェクト DataService にサーバー同期コンポーネントを生成することも必要です。
n 層アプリケーションでデータ同期を構成するには
[サーバー接続] を SQL Server バージョンの Northwind データベースに設定します。
[追加] ボタンをクリックして [オフライン使用のためのテーブルの構成] ダイアログ ボックスを開きます。
Customers テーブルに関連付けられているチェック ボックスをオンにし、[OK] をクリックします。(既定値をそのままにします。)
[詳細設定] をクリックします。
[サーバー プロジェクトの場所] の一覧で [DataService] を選択します。
[OK] をクリックします。
同期コンポーネントが生成され、データの初回の同期が実行され (つまり、ローカル データベースがプロジェクト内に作成されてデータが取り込まれ)、データ ソース構成ウィザードが開きます。
Customers テーブルを選択し、[データベース オブジェクトの選択] ページで、そのテーブルに関連付けられているチェック ボックスをオンにします。
[データセット名] に LocalNorthwindCustomers と入力し、[完了] をクリックします。
既存のデータ サービスで同期を有効にする
生成された同期コンポーネントは DataService プロジェクトに追加されましたが、これからサービスによって実装する必要があります。生成された SyncContract にはサービスにとって必要な情報が含まれています。その情報は、ファイル内ではコメントになっています。サービスの App.config ファイルの該当するセクションに必要な情報をコピーする必要があります。
App.config ファイルにサービス情報を追加するには
ソリューション エクスプローラで CustomersCache.Server.SyncContract ファイルをダブルクリックして開きます。
以下のようなコメント行を探します。
<endpoint address ="" binding="wsHttpBinding" contract="DataService.ICustomersCacheSyncContract"/>
コメント文字を含めずにその行をコピーします。
ソリューション エクスプローラで DataService の App.config ファイルをダブルクリックして開きます。
<!-- Metadata Endpoints --> コメントを探します。手順 3 でコピーした行を <endpoint address = "mex" で始まる行の下に追加します。
貼り付けたエンドポイント アドレスとして SyncServer などの名前を入力します。以下のようなコードが出来上がります。
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> <endpoint address ="SyncServer" binding="wsHttpBinding" contract="DataService.ICustomersCacheSyncContract"/>
[ビルド] メニューの [ソリューションのビルド] をクリックします。
同期サービス操作を既存のデータ サービスに追加するには
ソリューション エクスプローラで CustomersCache.Server.SyncContract ファイルをダブルクリックして開きます。
クラスの名前を CustomersCacheSyncService から Service1 に変更します。クラス名を変更した後のクラス宣言は、以下のコードのようになります。(C# のユーザーは、コンストラクタの名前も変更する必要があります。)
Partial Public Class Service1 Inherits Object Implements ICustomersCacheSyncContract ...
public partial class Service1 : object, ICustomersCacheSyncContract {...
C# ユーザーの場合:
Service1.cs ファイルで、Service1 のクラス宣言を以下のような部分クラスに変更します。
public partial class Service1 : object, ICustomersCacheSyncContract { private CustomersCacheServerSyncProvider _serverSyncProvider; public Service1() {...
[ビルド] メニューの [ソリューションのビルド] をクリックします。
既存のサービスに同期操作が追加されたので、PresentationTier プロジェクトでサービスの参照を更新する必要があります。
サービス参照を更新するには
ソリューション エクスプローラで、PresentationTier プロジェクトの ServiceReference1 を探します。
[ServiceReference1] を右クリックし、[サービス参照の更新] をクリックします。
ローカル キャッシュから Customers データを読み込むようにフォームを変更する
プレゼンテーション層のフォームは、データ サービスからデータを取得するようになっています。したがって、SQL Server Compact 3.5 データベースにある Customers テーブルのローカル コピーからデータを読み込むようにコードを変更しなければなりません。Orders テーブルには、DataService から返されたデータが読み込まれます。
ローカル データベース キャッシュから Customers データを読み込むように Form1 を変更するには
コード エディタで Form1 を開きます。
既存の Form1_Load コードを次のコードに置き換えます。
Using DataSvc As New ServiceReference1.Service1Client ' Create a CustomersTableAdapter to load data from ' the local database cache. Dim CustomersTableAdapter As New LocalNorthwindCustomersTableAdapters.CustomersTableAdapter NorthwindDataSet.Customers.Merge(CustomersTableAdapter.GetData) NorthwindDataSet.Orders.Merge(DataSvc.GetOrders) End Using
using (ServiceReference1.Service1Client DataSvc = new ServiceReference1.Service1Client()) { LocalNorthwindCustomersTableAdapters.CustomersTableAdapter customersTableAdapter = new LocalNorthwindCustomersTableAdapters.CustomersTableAdapter(); northwindDataSet.Customers.Merge(customersTableAdapter.GetData()); northwindDataSet.Orders.Merge(DataSvc.GetOrders()); }
アプリケーションのテスト
アプリケーションを実行します。ローカル データベース キャッシュとデータ サービスの両方からデータが取り込まれます。
アプリケーションをテストするには
F5 キーを押します。
Customers テーブルのデータはローカル データベースから、Orders テーブルのデータはデータ サービスから取り込まれます。
フォームを閉じます
データの同期
プレゼンテーション層で正しいソースからテーブルを表示するための設定ができたので、次に、同期を開始するコードを追加します。さらに、同期処理を開始するボタンもフォームに追加します。
ローカル データベース キャッシュとリモート データベースのデータを同期するには
デザイン ビューで [Form1] を開きます。
フォームの ToolStrip をクリックして、ToolStrip にボタンを追加します。
ボタンに SyncButton という名前を付けます。
SyncButton をダブルクリックして、SyncButton_Click イベント ハンドラを作成します。
同期処理を開始するコードを以下に示します。このコードをイベント ハンドラに追加します。
Dim syncAgent As CustomersCacheSyncAgent = New CustomersCacheSyncAgent Using syncClient As New ServiceReference1.CustomersCacheSyncContractClient syncAgent.RemoteProvider = New Microsoft.Synchronization.Data.ServerSyncProviderProxy(syncClient) Dim syncStats As Microsoft.Synchronization.Data.SyncStatistics = syncAgent.Synchronize NorthwindDataSet.Customers.Merge(New LocalNorthwindCustomersTableAdapters.CustomersTableAdapter().GetData()) Dim syncSummary As String = "Total changes downloaded: " & _ syncStats.TotalChangesDownloaded.ToString() & vbCrLf & _ "Last successful synchronization: " & _ syncStats.SyncCompleteTime.ToString MessageBox.Show(syncSummary) End Using
CustomersCacheSyncAgent syncAgent = new CustomersCacheSyncAgent(); using (ServiceReference1.CustomersCacheSyncContractClient syncClient = new ServiceReference1.CustomersCacheSyncContractClient()) { syncAgent.RemoteProvider = new Microsoft.Synchronization.Data.ServerSyncProviderProxy(syncClient); Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize(); northwindDataSet.Customers.Merge(new LocalNorthwindCustomersTableAdapters.CustomersTableAdapter().GetData()); string syncSummary = "Total changes downloaded: " + syncStats.TotalChangesDownloaded.ToString() + Environment.NewLine + "Last successful synchronization: " + syncStats.SyncCompleteTime.ToString(); MessageBox.Show(syncSummary); }
Customers テーブルのデータはローカル データベースから、Orders テーブルのデータはデータ サービスから取り込まれます。
フォームを閉じます
アプリケーションのテスト
アプリケーションをテストするには
F5 キーを押します。
アプリケーションを実行している状態で、サーバー エクスプローラまたはデータベース エクスプローラ (または他のデータベース管理ツール) を使用し、リモート サーバー データベースに接続してレコードを変更します。
サーバー エクスプローラまたはデータベース エクスプローラで、リモート データベース サーバー (Northwind.sdf への接続ではありません) 上の Customers テーブルを探します。
Customers テーブルを右クリックし、[テーブル データの表示] をクリックします。
1 つ以上のレコードを変更し、変更をコミットします (変更した行以外に移動します)。
フォームに戻り、[SyncButton] をクリックします。
リモート データベースへの変更がローカル データベースと同期され、グリッドに表示されることを検証します。
フォームを閉じます (デバッグを停止します)。
次の手順
n 層アプリケーションにローカル データベース キャッシュを追加した後で、アプリケーションの要件によってはさらに操作を追加する必要があります。たとえば、このアプリケーションで行うことができる拡張には次のものがあります。
データセットに検証を追加します。詳細については、「チュートリアル : n 層データ アプリケーションへの検証の追加」を参照してください。
双方向の同期を有効にします。詳細については、「方法 : ローカル データベースとリモート データベースで双方向同期を構成する」を参照してください。
参照
処理手順
方法 : n 層アプリケーションのデータセットにコードを追加する
チュートリアル : n 層データ アプリケーションへの検証の追加
チュートリアル : 接続の頻度があまり高くないアプリケーションの作成
チュートリアル : 接続の頻度があまり高くないクライアント アプリケーションとローカル データベースの配置
方法 : ローカル データベースとリモート データベースで双方向同期を構成する
概念
SQL Server Compact 3.5 と Visual Studio