演练:向 N 层应用程序添加本地数据库缓存

更新:2007 年 11 月

Visual Studio 上下文中的“本地数据库缓存”是 SQL Server Compact 3.5 数据库,该数据库配置为使用 Microsoft Synchronization Services for ADO.NET 与远程数据库进行数据同步。本演练提供向应用程序(在演练:创建 N 层数据应用程序主题中创建的应用程序)添加 SQL Server Compact 3.5 数据库的分步说明。

在本演练中,您将学习如何执行以下任务:

  • 向项目中添加本地数据库缓存项。

  • 配置数据同步。

  • 将同步操作合并到现有数据服务中。

  • 修改用于加载数据的代码,使其从本地数据库缓存中检索 Customers 表。

  • 添加代码以启动同步进程。

先决条件

若要完成此演练,需要满足以下条件:

说明:

对于在以下说明中使用的某些 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”,再单击“添加新项”。

  2. 单击“本地数据库缓存”模板。

  3. 在“名称”中键入“CustomersCache”。

  4. 单击“添加”。

    “配置数据同步”对话框随即打开。

配置数据同步

若要配置数据同步,请先选择到服务器的数据连接,再选择要缓存到应用程序本地的表。对于本演练,请将服务器连接设置为 Northwind 数据库的 SQL Server 版本,并将 Customers 表添加到本地缓存。此外,由于是将本地数据库缓存添加到一个 n 层应用程序,因此还必须设置高级选项,以将服务器同步组件生成到一个单独的项目 DataService 中。

在 n 层应用程序中配置数据同步

  1. 将“服务器连接”设置为 Northwind 数据库的 SQL Server 版本。

  2. 单击“添加”按钮以打开“配置供脱机使用的表”对话框。

  3. 选中与“Customers”表相关联的复选框,然后单击“确定”。(保留默认值。)

  4. 单击“高级”。

  5. 在“服务器项目位置”列表中选择“DataService”。

  6. 单击“确定”。

    将生成同步组件,首次同步数据(在项目中创建本地数据库并填充数据),同时打开数据源配置向导

  7. 选择“Customers”表,然后在“选择数据库对象”页上选中与之关联的复选框。

  8. 键入 LocalNorthwindCustomers 作为“数据集名称”,然后单击“完成”。

在现有数据服务中启用同步

生成的同步组件已添加到 DataService 项目中,但还需要通过服务来实现它们。生成的 SyncContract 包含服务所需的信息。此信息在文件中显示为注释。将必要的信息复制到服务的 App.config 文件中的相应部分。

向 App.config 文件中添加服务信息

  1. 在“解决方案资源管理器”中双击 CustomersCache.Server.SyncContract 文件以将其打开。

  2. 找到与下面的内容类似的命令行:

    <endpoint address ="" binding="wsHttpBinding" contract="DataService.ICustomersCacheSyncContract"/>

  3. 复制该命令行(不含注释字符)。

  4. 在“解决方案资源管理器”中双击 DataService 的 App.config 文件以打开该文件。

  5. 找到 <!-- Metadata Endpoints --> 注释。在以 <endpoint address = "mex" 开头的命令行下面添加在步骤 3 中复制的命令行。

  6. 为刚粘贴的终结点地址键入一个名称(例如“SyncServer”),这样就有了与下面的内容类似的代码:

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <endpoint address ="SyncServer" binding="wsHttpBinding" contract="DataService.ICustomersCacheSyncContract"/>
    
  7. 在“生成”菜单上单击“生成解决方案”。

向现有的数据服务添加同步服务操作

  1. 在“解决方案资源管理器”中双击 CustomersCache.Server.SyncContract 文件以将其打开。

  2. 将类名从“CustomersCacheSyncService”更改为“Service1”。下面的代码示例演示在更改了类名后应当显示的类声明。(C# 用户还必须更改构造函数的名称。)

    Partial Public Class Service1
        Inherits Object
        Implements ICustomersCacheSyncContract
    ...
    
    public partial class Service1 : object, ICustomersCacheSyncContract
    {...
    
  3. 对于 C# 用户:

    在 Service1.cs 文件中将 Service1 的类声明更改为一个分部类,以使声明类似于以下内容:

    public partial class Service1 : object, ICustomersCacheSyncContract {
    
    private CustomersCacheServerSyncProvider _serverSyncProvider;
    
    public Service1() 
    {...
    
  4. 在“生成”菜单上单击“生成解决方案”。

由于向现有服务添加了同步操作,因此必须更新 PresentationTier 项目中的服务引用。

更新服务引用

  1. 在“解决方案资源管理器”中找到 PresentationTier 项目中的“ServiceReference1”。

  2. 右击“ServiceReference1”,再单击“更新服务引用”。

修改用于从本地缓存加载客户数据的窗体

当前表示层中的窗体从数据服务来获取其数据。因此,必须修改代码,以从 SQL Server Compact 3.5 数据库中 Customers 表的本地副本加载数据。Orders 表则仍用从 DataService 返回的数据进行加载。

修改 Form1 以从本地数据库缓存加载客户数据

  1. 在代码编辑器中打开 Form1。

  2. 用下面的代码替换现有的 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());
    }
    

测试应用程序

运行该应用程序。从本地数据库缓存和数据服务检索数据。

测试应用程序

  1. 按 F5。

  2. Customers 表中的数据从本地数据库进行检索,Orders 表中的数据从数据服务进行检索。

  3. 关闭窗体。

同步数据

现在表示层已设置就绪,可以从正确的源显示表,下一步是添加代码来启动同步。将在窗体中添加一个按钮来启动同步进程。

在本地数据库缓存和远程数据库之间同步数据

  1. 在“设计”视图中打开“Form1”。

  2. 在窗体上单击 Toolstrip,并在 Toolstrip 中添加一个按钮。

  3. 将该按钮命名为“SyncButton”。

  4. 双击 SyncButton 以创建一个 SyncButton_Click 事件处理程序。

  5. 下面的代码示例用于启动同步进程。将其添加到事件处理程序。

    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);
    }
    
  6. Customers 表中的数据从本地数据库进行检索,Orders 表中的数据从数据服务进行检索。

  7. 关闭窗体。

测试应用程序

测试应用程序

  1. 按 F5。

  2. 运行应用程序时,使用“服务器资源管理器”/“数据库资源管理器”(或其他数据库管理工具)连接到远程服务器数据库并修改某些记录。

    1. 在“服务器资源管理器”/“数据库资源管理器”中,查找远程数据库服务器(不是到 Northwind.sdf 的连接)上的 Customers 表。

    2. 右击 Customers 表,然后单击“显示表数据”。

    3. 修改一条或多条记录,然后提交更改。(导航关闭已修改的行。)

  3. 返回到窗体,然后单击“SyncButton”。

  4. 验证对远程数据库的修改是否已同步到本地数据库并显示在网格中。

  5. 关闭窗体。(停止调试。)

后续步骤

根据应用程序的要求,向 n 层应用程序中添加了本地数据库缓存后,可能还要执行一些步骤。例如,您可以对此应用程序进行以下增强:

请参见

任务

如何:向 N 层应用程序的数据集添加代码

演练:向 N 层数据应用程序添加验证

演练:创建偶尔连接的应用程序

演练:将偶尔连接的客户端应用程序与本地数据库一起部署

如何:将本地数据库和远程数据库配置为双向同步

概念

N 层数据应用程序概述

偶尔连接的应用程序概述

SQL Server Compact 3.5 和 Visual Studio

数据中的新增功能

其他资源

分层更新

访问数据 (Visual Studio)