SQL Server 2008构建偶尔连接系统
【IT168 技术文档】
通过Microsoft Synchronization Services for ADO.NET
构建偶尔连接系统
目录
准备工作 1
练习1:构建偶尔连接的应用程序 2
练习 2:将本地数据库和远程数据库配置为双向同步 7
练习 3:向 N 层应用程序添加本地数据库缓存 8
准备工作
预计完成本实验所需的时间
60 分钟
目标
在完成本实验后,您将可以:
• 使用Sync Services进行数据同步
• 构建偶尔连接系统
先决条件
在完成本实验前,您必须具有:
• 编写Transact-SQL 脚本与使用SQL Server Management Studio的相关经验。
• 使用C#语言开发Windows应用程序的相关经验。
实验场景
“偶尔连接的应用程序”是可能不总是访问远程数据的应用程序。因为这些应用程序不总是访问远程数据,所以它们使用位于客户端的本地数据库的数据,并会定期同步远程数据库中的数据和本地数据库中的数据。Microsoft Synchronization Services for ADO.NET(Microsoft.Synchronization.Data 命名空间)帮助实现本地数据库和远程数据库之间的数据同步。您可以在“配置数据同步”对话框中配置此同步。
虚拟机环境
1. 从开始菜单或桌面上启用Microsoft Virtual PC 。如果Virtual PC 控制台没有启用,请查看系统托盘,然后双击系统托盘当中的Microsoft Virtual PC 。
2. 选择Sql08 然后点击Start。
3. 在虚拟机运行起来后,可以通过点击右Alt+Del 来向虚拟机发送一个Ctrl+Alt+Del 命令。
4. 在登录窗口中,输入以下信息:
• User name: administrator
• Password: password01!
练习1:构建偶尔连接的应用程序
在本演练中,您将要执行以下任务:
创建新的 Windows 窗体应用程序。
向项目中添加新的“本地数据库缓存”。
配置执行以下任务的同步设置:
设置到服务器数据库的数据连接。
配置同步以创建新的本地数据库。
选择您要利用您的应用程序进行同步的数据库中的表。
将 DataGridView 控件添加到窗体,以显示来自本地数据库的数据。
添加代码以启动数据库间的同步。
添加消息框以显示已同步的记录的数目信息。
创建 Windows 窗体应用程序
由于您将要在 Windows 窗体中显示数据(以验证同步是否成功),所以本演练的第一步是创建新的 Windows 窗体应用程序。
注意:对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。
1. 从“File”、“New”、“Project”菜单创建一个新的项目。
2. 将项目命名为 OCSWalkthrough。
注意:由于 Visual Basic 项目和 C# 项目都支持“配置数据同步”对话框,所以可以使用此两种语言中的任意一种语言来创建新项目。
3. 单击“Windows Form Application”模板,然后单击“确定”。
4. 然后,就会创建 OCSWalkthrough 项目,并会将其添加到解决方案资源管理器中。
向项目中添加同步文件
创建偶尔连接的应用程序的第二步是向客户端添加(或在客户端创建)本地数据库。若要添加可与远程数据库同步的数据库,则请将“本地数据库缓存”模板添加到项目中。您可以使用“添加新项”对话框,将本地数据库缓存文件(.sync 文件)添加到项目中。
1. 在“Project”菜单上单击“Add New Item”。
2. 单击“Local Database Cache”模板,并在“Name”文本框中键入 NorthwindCache.sync。
3. 单击“Add”。
4. 然后,NorthwindCache.sync 文件就会添加到解决方案资源管理器中,并会出现“Configure Data Synchronization”对话框。
创建本地数据存储
配置数据同步包含以下任务:
提供到远程数据库的数据连接。这就是服务器连接。
提供到本地数据库的数据连接,或在客户端上创建新的数据库,如本演练中所示。这就是客户端连接。
从远程连接选择您要在您的应用程序中使用的表。这些表称为“缓存的表”。
为每个您要添加到本地数据库中的表,选择协调更改所需的列和用于存储删除项的表。除了跟踪已删除记录的表之外,每个表还需
要跟踪新记录和已修改记录的特定列。
1. 选择到 Northwind 数据库的 SQL Server 版本的“Server Connection”,或单击“New”以创建到 Northwind 数据库的 SQL Server 版本。
2. 保留“Client Connection”的“Northwind.sdf(New)”的默认值。这会创建一个新的 SQL Server Compact 3.5 数据库并会将其添加到项目中。
3. 选择了服务器连接之后,“Configure Data Synchronization”对话框就会在服务器的远程数据库中查询可用表的列表,并会在检索到列表之后启用“Add”按钮。
注意:请注意,“确定”按钮并未启用。这是因为尚未选择用于同步的表。下一节将解释如何添加表,进而启用“确定”按钮。
配置用于本地缓存的表
1. 单击“Add”以打开“Configure Tables for Offline Use”对话框。
2. 选择并选中“Customers”表。
3. 保留所有的默认值。单击“OK”。
4. “Customers”表就会添加到“Cached Tables”列表中。
5. 在“Configure Data Synchronization”对话框中单击“OK”。
6. 在弹出的对话框中,点击“OK”。
7. 然后,就会在服务器上创建跟踪列和存储删除项的表。同时,还会在项目中创建 Northwind.sdf 数据库,并会对其进行首次同步。
8. 在“Data Source Configuration Wizard”中选择并选中“Customers”表,然后单击“OK”。
9. NorthwindDataSet.xsd 就会添加到项目中,同时所有的对话框都会关闭。
在应用程序中启用同步
完成上述步骤后,数据同步也就配置完毕了。现在,您的应用程序中包含以下内容:
本地 Northwind 数据库(“Northwind.sdf”)。
数据同步设置信息(“NorthwindCache.sync”)。
由“数据源配置”向导生成的类型化数据集“NorthwindDataSet.xsd”。它包含从本地数据库填充的“Customers”表。
一个包含脚本的“SQLScripts”文件夹,这些脚本可用于创建跟踪服务器变化的跟踪列、已删除项表和必要的触发器。
一个包含脚本的“SQLUndoScripts”文件夹,这些脚本可用于删除添加到服务器中的跟踪列、已删除项表和必要的触发器。
注意:只有需要在服务器上进行修改时,才会创建 SQL 脚本。如果服务器已经具有已删除项表和跟踪列,将不会创建任何脚本。
? 对以下 Microsoft Synchronization Services for ADO.NET DLL 的引用:
? Microsoft.Synchronization.Data
? Microsoft.Synchronization.Data.Server
? Microsoft.Synchronization.Data.SqlServerCe
配置完数据同步后,您还必须将同步功能添加到应用程序中。具体而言,您需要添加启动同步过程的代码。
1. 在菜单中,点击“Data”,“Show Data Source”,以显示“Data Sources”窗口。
2. 将“Customers”节点从“Data Sources”窗口拖到“Form1”中。
3. 将一个“Button”控件从“ToolBox”拖到“Form1”中。将此按钮的“Name”属性设置为“SynchronizeButton”,将它的“Text”属性设置为“Synchronize Now”。
4. 双击“Synchronize Now”按钮以创建按钮单击事件处理程序,并在代码编辑器中打开该窗体。
5. 添加代码以启动同步进程,然后在数据集中重新填充“Customers”表。事件处理程序中的代码应与下面的代码类似:
注意:声明 syncStats 变量的代码行将在下一节中进行介绍。
// data between local and remote databases.
Microsoft.Synchronization.Data.SyncStatistics syncStats;
syncStats = NorthwindCacheSyncAgent.Instance.Synchronize();
// After synchronizing the data, refill the
// table in the dataset.
this.customersTableAdapter.Fill(this.northwindDataSet.Customers);
测试应用程序
1. 按 F5。
2. 运行应用程序时,使用服务器资源管理器/数据库资源管理器(或其他数据库管理工具)以连接到远程服务器数据库并修改某些记录。
i. 在服务器资源管理器/数据库资源管理器中,查找远程数据库服务器(不是到 Northwind.sdf 的连接)上的 Customers 表。
ii. 右击 Customers 表,然后单击“Show Table Data”。
iii. 修改一条或多条记录,然后提交更改。(导航关闭已修改的行。)
3. 返回到窗体,然后单击“Synchronize Now”。
4. 验证对远程数据库的修改是否已同步到本地数据库并显示在网格中。
5. 关闭窗体。(停止调试。)
检索同步信息
调用“Synchronize”方法时,该方法并不仅仅启动同步进程。“Synchronize”方法还会返回“SyncStatistics”对象,您可以从该对象访问有关同步的信息。
1. 在代码编辑器中打开“Form1”,然后在 SynchronizeButton_Click 事件处理程序的底部,接着先前步骤所添加的代码添加以下代码:
syncStats.TotalChangesDownloaded.ToString());
测试应用程序
1. 按 F5。
2. 运行应用程序时,使用服务器资源管理器/数据库资源管理器(或其他数据库管理工具)以连接到远程服务器数据库并修改某些记录。
i. 在服务器资源管理器/数据库资源管理器中,查找远程数据库服务器(不是到 Northwind.sdf 的连接)上的 Customers 表。
ii. 右击 Customers 表,然后单击“Show Table Data”。
iii. 修改一条或多条记录,然后提交更改。(导航关闭已修改的行。)
3. 返回到窗体,然后单击“Synchronize Now”。
4. 此时,将显示一个包含已同步记录的信息的消息框。
5. 验证对远程数据库的修改是否已同步到本地数据库并显示在网格中。
练习 2:将本地数据库和远程数据库配置为双向同步
您可以使用“配置数据同步”对话框仅为下载方案配置 Microsoft Synchronization Services for ADO.NET。这意味着,在您使用“配置数据同步”对话框配置数据同步之后,调用 Synchronize()()() 将只能利用在远程数据库上找到的更改来更新本地数据库。对本地数据库上的数据所进行的更改将不会上载到远程数据库。
SyncTable.SyncDirection 属性可控制本地和远程数据库之间的表同步方式。默认情况下,“配置数据同步”对话框会对同步进行配置,因此,SyncTable.SyncDirection 属性的值为 Microsoft.Synchronization.Data.SyncDirection.DownloadOnly。配置完数据同步之后,您可以通过将 SyncTable.SyncDirection 属性设置为 Bidirectional,来以编程方式启用双向同步。
在本地和远程数据库之间启用双向同步
1. 通过将“Local Database Cache”项添加到项目,并在“Synchronize Now”对话框中设置相应的配置,可为您的应用程序配置同步。
2. 在创建新 SyncAgent 的代码行之后,调用 Synchronize()方法的代码行之前,添加设置 SyncDirection 属性的代码。
3. 下面的代码演示如何为配置为同步 Northwind 客户表的应用程序启用双向同步:
LocalDataCache1SyncAgent syncAgent = new LocalDataCache1SyncAgent();
Microsoft.Synchronization.Data.SyncDirection.Bidirectional;
Microsoft.Synchronization.Data.SyncStatistics syncStats =
syncAgent.Synchronize();
练习 3:向 N 层应用程序添加本地数据库缓存
Visual Studio 上下文中的“本地数据库缓存”是 SQL Server Compact 3.5 数据库,该数据库配置为使用 Microsoft Synchronization Services for ADO.NET 与远程数据库进行数据同步。
在本演练中,您将学习如何执行以下任务:
向项目中添加本地数据库缓存项。
配置数据同步。
将同步操作合并到现有数据服务中。
修改用于加载数据的代码,使其从本地数据库缓存中检索 Customers 表。
添加代码以启动同步进程。
打开 NTierWalkthrough 解决方案
1. 在“File”菜单上指向“Open”,单击“Project/Solution”,然后定位到C:\SQLHOLS\OCS\NTierWalkthrough\NTierWalkthrough.sln 文件,点击OK。
向 NTierWalkthrough 添加本地数据库缓存
由于本地数据库缓存是一个位于客户端上的 SQL Server Compact 3.5 数据库,因此将本地数据库缓存添加到 PresentationTier 项目。由于本演练将演示如何缓存 Customers 表,因此将本地数据库缓存命名为 CustomersCache。
注意:在本演练中,本地数据库缓存因为只使用了 Customers 表而被命名为 CustomersCache,但其实可以向本地数据库缓存添加多个表。
1. 在“Solution Explorer”中右击“PresentationTier”,再单击“Add New Item”。
2. 单击“Local Database Cache”模板。
3. 在“Name”中键入“CustomersCache”。
4. 单击“Add”。
5. “Configure Data Synchronization”对话框随即打开。
在 n 层应用程序中配置数据同步
若要配置数据同步,请先选择到服务器的数据连接,再选择要缓存到应用程序本地的表。对于本演练,请将服务器连接设置为 Northwind 数据库的 SQL Server 版本,并将 Customers 表添加到本地缓存。此外,由于是将本地数据库缓存添加到一个 n 层应用程序,因此还必须设置高级选项,以将服务器同步组件生成到一个单独的项目 DataService 中。
1. 将“Server Connection”设置为 Northwind 数据库的 SQL Server 版本。
2. 单击“Add”按钮以打开“Configure Tables for Offline Use”对话框。
3. 选中与“Customers”表相关联的复选框,然后单击“OK”。(保留默认值。)
4. 单击“Advanced”。
5. 在“Server Item Locations”列表中选择“DataService”。
6. 单击“OK”。
7. 将生成同步组件,首次同步数据(在项目中创建本地数据库并填充数据),同时打开数据源配置向导。
8. 选择“Customers”表,然后在“Select Database Objects”页上选中与之关联的复选框。
9. 键入 LocalNorthwindCustomers 作为“DataSet Name”,然后单击“OK”。
向 App.config 文件中添加服务信息
生成的同步组件已添加到 DataService 项目中,但还需要通过服务来实现它们。生成的 SyncContract 包含服务所需的信息。此信息在文件中显示为注释。将必要的信息复制到服务的 App.config 文件中的相应部分。
1. 在“Solution Explorer”中双击 CustomersCache.Server.SyncContract 文件以将其打开。
2. 找到与下面的内容类似的命令行:
<endpoint address ="" binding="wsHttpBinding" contract="DataService.ICustomersCacheSyncContract"/>
3. 复制该命令行(不含注释字符)。
4. 在“Solution Explorer”中双击 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. 在“Build”菜单上单击“Build Solution”。
向现有的数据服务添加同步服务操作
1. 在“Solution Explorer”中双击 CustomersCache.Server.SyncContract 文件以将其打开。
2. 将类名从“CustomersCacheSyncService”更改为“Service1”。下面的代码示例演示在更改了类名后应当显示的类声明。(C# 用户还必须更改构造函数的名称。)
{...
3. 对于 C# 用户:
4. 在 Service1.cs 文件中将 Service1 的类声明更改为一个分部类,以使声明类似于以下内容:
private CustomersCacheServerSyncProvider _serverSyncProvider;
public Service1()
{...
5. 在“Build”菜单上单击“Build Solution”。
更新服务引用
由于向现有服务添加了同步操作,因此必须更新 PresentationTier 项目中的服务引用。
1. 在“Solution Explorer”中找到 PresentationTier 项目中的“ServiceReference1”。
2. 右击“ServiceReference1”,再单击“更新服务引用”。
修改用于从本地缓存加载客户数据的窗体
当前表示层中的窗体从数据服务来获取其数据。因此,必须修改代码,以从 SQL Server Compact 3.5 数据库中 Customers 表的本地副本加载数据。Orders 表则仍用从 DataService 返回的数据进行加载。
1. 在代码编辑器中打开 Form1。
2. 用下面的代码替换现有的 Form1_Load 代码:
{
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. 下面的代码示例用于启动同步进程。将其添加到事件处理程序。
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. 运行应用程序时,使用“Server Explorer/Database Connections”(或其他数据库管理工具)连接到远程服务器数据库并修改某些记录。
3. 在“Server Explorer/Database Connections”中,查找远程数据库服务器(不是到 Northwind.sdf 的连接)上的 Customers 表。
4. 右击 Customers 表,然后单击“Show Table Data”。
5. 修改一条或多条记录,然后提交更改。(导航关闭已修改的行。)
6. 返回到窗体,然后单击“SyncButton”。
7. 验证对远程数据库的修改是否已同步到本地数据库并显示在网格中。
8. 关闭窗体。(停止调试。)