演练:向 N 层应用程序添加本地数据库缓存
Visual Studio 上下文中的“本地数据库缓存”是 SQL Server Compact 3.5 数据库,该数据库配置为使用 Microsoft Synchronization Services for ADO.NET 与远程数据库进行数据同步。 本演练提供向应用程序(在演练:创建 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,但其实可以向本地数据库缓存添加多个表。
向表示层添加本地数据缓存
在**“解决方案资源管理器”中右击“PresentationTier”,再单击“添加新项”**。
单击**“本地数据库缓存”**模板。
在**“名称”**中键入“CustomersCach”。
单击**“添加”**。
**“配置数据同步”**对话框随即打开。
配置数据同步
若要配置数据同步,请先选择到服务器的数据连接,再选择要缓存到应用程序本地的表。 对于本演练,请将服务器连接设置为 Northwind 数据库的 SQL Server 版本,并将 Customers 表添加到本地缓存。 此外,由于是将本地数据库缓存添加到一个 n 层应用程序,因此还必须设置高级选项,以将服务器同步组件生成到一个单独的项目 DataService 中。
在 n 层应用程序中配置数据同步
将**“服务器连接”**设置为 Northwind 数据库的 SQL Server 版本。
单击**“添加”按钮以打开“配置供脱机使用的表”**对话框。
选中与**“Customers”表相关联的复选框,然后单击“确定”**。 (保留默认值。)
单击**“高级”**。
在**“服务器项目位置”列表中选择“DataService”**。
单击**“确定”**。
将生成同步组件,首次同步数据(在项目中创建本地数据库并填充数据),同时打开数据源配置向导。
选择**“Customers”表,然后在“选择数据库对象”**页上选中与之关联的复选框。
键入 LocalNorthwindCustomers 作为**“数据集名称”,然后单击“完成”**。
在现有数据服务中启用同步
生成的同步组件已添加到 DataService 项目中,但还需要通过服务来实现它们。 生成的 SyncContract 包含服务所需的信息。 此信息在文件中显示为注释。 将必要的信息复制到服务的 App.config 文件中的相应部分。
向 App.config 文件中添加服务信息
在**“解决方案资源管理器”**中双击 CustomersCache.Server.SyncContract 文件以将其打开。
找到与下面的内容类似的命令行:
<endpoint address ="" binding="wsHttpBinding" contract="DataService.ICustomersCacheSyncContract"/>
复制该命令行(不含注释字符)。
在**“解决方案资源管理器”**中双击 DataService 的 App.config 文件以打开该文件。
找到 <!-- Metadata Endpoints --> 注释。 在以 <endpoint address = "mex" 开头的命令行下面添加在步骤 3 中复制的命令行。
为刚粘贴的终结点地址键入一个名称(例如“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”,再单击“更新服务引用”**。
修改用于从本地缓存加载客户数据的窗体
当前表示层中的窗体从数据服务来获取其数据。 因此,必须修改代码,以从 SQL Server Compact 3.5 数据库中 Customers 表的本地副本加载数据。 Orders 表则仍用从 DataService 返回的数据进行加载。
修改 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 表,然后单击**“显示表数据”**。
修改一条或多条记录,然后提交更改。 (导航关闭已修改的行。)
返回到窗体,然后单击“SyncButton”。
验证对远程数据库的修改是否已同步到本地数据库并显示在网格中。
关闭窗体。 (停止调试。)
后续步骤
根据应用程序的要求,向 n 层应用程序中添加了本地数据库缓存后,可能还要执行一些步骤。 例如,您可以对此应用程序进行以下增强:
向数据集添加验证。 有关信息,请参见演练:向 N 层数据应用程序添加验证。
启用双向同步。 有关信息,请参见如何:将本地数据库和远程数据库配置为双向同步。
请参见
任务
概念
SQL Server Compact 3.5 和 Visual Studio