接続の頻度があまり高くないアプリケーションの概要

接続の頻度があまり高くないアプリケーションとは、リモート データベースのデータを使用するが、リモート データベースに常にアクセスできるとは限らないアプリケーションのことです。 接続の頻度があまり高くないアプリケーションは、継続的なアクセスが可能な状況でも、ほとんど変更されることがないデータ (状態や製品カテゴリの一覧など) をリモート データベースに継続的に照会するのは効率的でない場合に使用されます。 このような状況では、アプリケーションはクライアントに存在するローカル データベースのデータを使用し、サーバーのリモート データベースとデータを定期的に同期できます。

言い換えると、アプリケーションがデータベースから継続的に取得する必要がないリモート データベースのデータを必要とする場合、ローカル データベース キャッシュを使用してクライアント コンピューター上にデータを保存したり、アプリケーション内に直接データを保存したりすることができます。 例として、データベース内の複数のテーブルのデータを使用する在庫管理アプリケーションについて考えてみましょう。 個々の部品の在庫品目数は、継続的に変化するデータの重要な部分であるため、アプリケーションは可能であれば常に最新の値をデータベースに反映する必要があります。 一方、アプリケーションにはほとんど変更されることがない配送業者の一覧も表示されます。 これらの有効な配送業者は出荷業者テーブルに保存されますが、データベースにデータを照会するたびに取得する必要はありません。 この出荷業者テーブルをローカル データベース キャッシュに保存することにより、アプリケーションがリモート データベースに対して生成する必要がある不必要なラウンドトリップの数を減らすことができます。 したがって、接続の頻度があまり高くないアプリケーションにローカル データベース キャッシュを使用するのに加えて、ほとんど変更されることがないデータや、既知のスケジュールで変更されるデータをローカル データベース キャッシュに保存することも検討できます。

個々のテーブル、テーブルのセット、またはテーブルに照会される特定のレコード (たとえば、特定の販売担当者を持つ顧客だけなど) を保存するように、キャッシュを構成できます。

クライアント データベースとサーバー データベースの間のデータの同期は、Microsoft Synchronization Services for ADO.NET (Microsoft.Synchronization.Data 名前空間) によって行います。 Visual Studio では、[データ同期の構成] ダイアログ ボックスを使用するか、型指定されたデータセットを作成するときにデータ ソース構成ウィザードを使用することにより、同期を視覚的に構成できます。 詳細については、「方法 : アプリケーションでデータ同期を構成する」および「チュートリアル : データ ソース構成ウィザードを使用した接続の頻度があまり高くないアプリケーションの作成」を参照してください。

さらに、Visual Studio では SQL Server 2008 の変更追跡機能がサポートされます。 [データ同期の構成] ダイアログ ボックスまたはデータ ソース構成ウィザードから同期を構成するときに、SQL Server 2008 の変更の追跡を有効にできます。 詳細については、「方法 : SQL Server の変更の追跡を使用するようにデータ同期を構成する」を参照してください。

SQL Azure でのローカル データベース キャッシュに関する制限事項

ローカル データベース キャッシュを使用して、SQL Azure で見つかったデータと、SQL Compact のローカル データベースを同期できます。 ただし、SQL Azure のようなクラウド ベースのサービスは、ユーザーが同じハードウェアを共有するマルチテナント環境を利用しますが、既存のデータ プロバイダーはマルチテナント環境用に効率化されていません。 あるユーザーによって発生する作業負荷の影響から別のユーザーを保護するため、SQL Azure ではスロットリング機構を使用して、1 つの要求に許可されるリソースの量を制限します。 具体的には、SQL Azure では、トランザクションが実行できる時間と、1 つのトランザクションに対して許されるログの増加量が制限されています。

基本的なシナリオと少量のデータには、このようなプロバイダーを使用する必要があります。 大量のデータを同期しようとすると、スロットリングの問題により同期操作が失敗する可能性があります。 スロットリングの問題が発生した場合、同期障害を避けるために変更の数を減らす方法はありません。 さらに、このようなプロバイダーは、双方向の同期を必要とするさらに複雑なシナリオには適していません。

SQL Azure が関係するシナリオ用に効率化されたコンポーネントの詳細については、https://go.microsoft.com/fwlink/?LinkId=180745 を参照してください。

Synchronization Services API (Microsoft.Synchronization.Data)

Microsoft Synchronization Services for ADO.NET は、接続の頻度があまり高くないアプリケーション向けに設計されています。 これにより、2 層、n 層、およびサービス ベースのアーキテクチャにまたがるさまざまなソースのデータを同期することが可能になります。 Synchronization Services API では、データベースとそのスキーマをレプリケートできるだけではなく、データ サービスとローカル ストアの間でデータを同期する一連のコンポーネントも使用できます。 アプリケーションは、中央サーバーへの一貫したネットワーク接続や信頼性のあるネットワーク接続を持たないモバイル クライアント (ノート型コンピューターやポータブル デバイスなど) でますます使用されるようになっています。 これらのアプリケーションでは、クライアント上のデータのローカル コピーを使用して動作することが重要です。 同様に重要なのは、ネットワーク接続が使用可能なときに、中央サーバーのデータによってデータのローカル コピーを同期するための要件です。 ADO.NET データ アクセス API の後にモデル化された Synchronization Services API を使用すると、データを直感的に同期できます。 接続の頻度があまり高くない環境のアプリケーションを、一貫したネットワーク接続に依存するアプリケーションの作成の論理的な拡張として作成できるようになります。

Synchronization Services API とドキュメントのインストール

Synchronization Services API は、.NET Framework の一部ではありません。 これは SQL Server Compact 3.5 インストールの一部としてインストールされます (既定では、SQL Server Compact 3.5 は Visual Studio のインストール時にインストールされます)。既定では、Synchronization Services のドキュメントはインストールされません。 したがって、ヘルプがオンラインで使用できるように構成されていないと、このドキュメントは使用できません。 ローカルで使用できるように Synchronization Services のドキュメントをインストールするには、まず「Microsoft Synchronization Services for ADO.NET Books Online」の Web サイトからヘルプ コレクションをダウンロードする必要があります。

Visual Studio によるアプリケーションへのデータ同期の組み込み

データ同期をアプリケーションに組み込むために、Visual Studio にはローカル データベース キャッシュ テンプレートが用意されています。 ローカル データベース キャッシュは、新しいプロジェクト項目テンプレートとして使用できます ([プロジェクト] メニューの [新しい項目の追加] をクリックします)。 詳細については、「方法 : アプリケーションでデータ同期を構成する」を参照してください。

[ローカル データベース キャッシュ] テンプレートを使用することに加えて、データ ソース構成ウィザードを使用して同期を構成することもできます。 型指定されたデータセットの構成時に、ウィザードの [データベース オブジェクトの選択] ページで、[ローカル データベース キャッシュを有効にする] をオンにします。 詳細については、「チュートリアル : データ ソース構成ウィザードを使用した接続の頻度があまり高くないアプリケーションの作成」を参照してください。

ローカル データベース キャッシュを追加すると、[データ同期の構成] ダイアログ ボックスが開きます。 このダイアログ ボックスでは、クライアントおよびサーバーの特定の情報を入力して、必要な同期コンポーネントを設定します。 ローカル データベース キャッシュは、クライアント上の SQL Server Compact 3.5 データベースを使用してデータをローカルに保存します。 既存の SQL Server Compact 3.5 データベースをローカル データベース キャッシュとして使用できます。 ローカル データベースがまだない場合、[データ同期の構成] ダイアログ ボックスを使用して新しいローカル データベースを作成できます。 新しいローカル SQL Server Compact 3.5 データベースを作成するには、[データ同期の構成] ダイアログ ボックスの [クライアント接続] を設定し、[サーバー接続] で選択したテーブルに基づいて新しい SQL Server Compact 3.5 データベースを作成します。

注意

[データ同期の構成] ダイアログ ボックスでは、ダウンロード シナリオでのみ Microsoft Synchronization Services for ADO.NET を構成できます。 これは、このダイアログ ボックスを使用してデータ同期を構成した後、Microsoft.Synchronization.Data.SyncAgent.Synchronize を呼び出すと、リモート データベースで見つかった変更によってローカル データベースのみが更新されることを意味します。 ローカル データベースのデータに加えられた変更は、リモート データベースにアップロードされません。 [データ同期の構成] ダイアログ ボックスを使用してデータ同期を構成すると、同期中にプログラムによりアップロード (双方向同期) を有効にできます。 詳細については、「方法 : ローカル データベースとリモート データベースで双方向同期を構成する」を参照してください。

同期対象のリモート データベースの構成

データ同期が正しく機能するには、同期対象とするリモート データベース上の各テーブルにいくつかの項目を追加する必要があります。 [データ同期の構成] ダイアログ ボックスでは、必要なオブジェクト (以下の表に示すオブジェクト) を作成するためにリモート データベースに対して実行できる SQL スクリプトが作成されます。 同期デザイナーにより作成されるすべての SQL スクリプトは、プロジェクトの SQLScripts フォルダーに保存されます。

注意

[データ同期の構成] ダイアログ ボックスによって生成された SQL スクリプトは、既定で実行されます。 [オフライン使用のためのテーブルの構成] ダイアログ ボックスで [スクリプト生成] オプションを設定すると、スクリプトを生成および実行するかどうかを選択できます。

[データ同期の構成] ダイアログ ボックスの既定の動作では、このダイアログ ボックスを閉じたときにスクリプトが自動的に実行され、リモート データベースが更新されます。 スクリプトを自動的に実行しない場合は [このダイアログが閉じられたらスクリプトを実行する] チェック ボックスをオフにします。 また、リモート データベースに必要なトラッキング列、トリガー、および削除された項目テーブルが既にある場合、スクリプトは生成されません。 言い換えると、リモート データベースを変更する必要がない場合は、スクリプトが作成されません。

次の表に、リモート データベースで必要な項目と各項目の説明を示します。

リモート データベース上で同期する各テーブルに追加する項目

説明

LastEditDate 列

この列は、同期する各テーブルで DateTime または TimeStamp となっている必要があります。 クライアント上の LastEditDate 列と比較され、前回の同期呼び出し以降にサーバー上で変更されたレコードを特定します。

CreationDate 列

この列は、同期する各テーブルで DateTime または TimeStamp となっている必要があります。 クライアント上の CreationDate 列と比較され、前回の同期呼び出し以降にサーバーに追加されたレコードを特定します。

削除された項目テーブル (TableName_Deleted)

項目は、データベース サーバー上のテーブルから削除されるとこのテーブルに移動されます。 これは、前回の同期呼び出し以降にサーバーから削除されたレコードを特定します。 同期対象の各テーブルには、リモート テーブルから削除されたレコードを追跡するために、削除された項目テーブルが必要です。

DeletionTrigger (TableName_DeletionTrigger)

このトリガーは、レコードがサーバー データベース テーブルから削除されるたびに表示されます。 削除されたレコードは、削除された項目テーブルに移動されます。 サーバー データベース上に存在しないクライアント データベースのレコードは新しいレコードとして扱われてサーバーに戻されるため、それらのレコードは削除された項目テーブルに移動されます。 Synchronization Services は、削除された項目テーブルを確認し、削除されたレコードをサーバー データベースに戻すのではなく、クライアント データベースから削除する必要があるかどうかを判断します。

InsertTrigger (TableName_InsertTrigger)

このトリガーは、新しいレコードが追加されると、現在の日付と時刻を CreationDate 列に入力します。

UpdateTrigger (TableName_UpdateTrigger)

このトリガーは、既存のレコードが変更されると、現在の日付と時刻を LastEditDate 列に入力します。

アプリケーションからの同期処理の開始

[データ同期の構成] ダイアログ ボックスに必要な情報を入力したら、同期を開始するコードをアプリケーションに追加します。 データを同期すると、データセット内のテーブルやアプリケーションの他のオブジェクトではなく、ローカル データベースが更新されることに注意してください。 必ず、アプリケーション データ ソースに、ローカル データベースから更新されたデータを再読み込みしてください。 たとえば、TableAdapter.Fill メソッドを呼び出して、データセットのデータ テーブルにローカル データベースから更新されたデータを読み込みます。

参照

処理手順

方法 : アプリケーションでデータ同期を構成する

チュートリアル : 接続の頻度があまり高くないアプリケーションの作成

方法 : ローカル データベースとリモート データベースで双方向同期を構成する

概念

SQL Server Compact 3.5 と Visual Studio

その他の技術情報

Visual Studio でのデータへのアクセス