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

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. 在**“名称”**中键入“CustomersCach”。

  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 中访问数据