Microsoft Sync Framework同步数据库 2:同步SQL Server和SQL Server Compact示例

同步SQL Server和SQL Server Compact示例

本篇文章通过使用 Sync Framework同步数据库的一个完整示例讲述了 执行常见同步任务的操作步骤。该示例旨在说明如何通过使用 Sync Framework 同步 SQL Server 数据库(包括 SQL Server Express 和 SQL Server Compact)。

创建示例服务器数据库

这里,我们将创建一个示例 SQL Server 数据库,以后在同步应用场景中将会使用该数据库。下面是创建该数据库的详细步骤:

1.启动SQL Server Management Studio(SSMS),连接到SQL Server服务器。

2.新建一个查询,输入并运行一下SQL脚本:

USE [master] 
GO

IF EXISTS(SELECT name FROM sys.databases WHERE name = 'SyncDB')
DROP DATABASE SyncDB

CREATE DATABASE [SyncDB]
GO

USE [SyncDB]
GO

CREATE TABLE [dbo].[Products](
[ID] [int] NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[ListPrice] [money] NOT NULL

CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED ([ID] ASC)
)
GO

CREATE TABLE [dbo].[Orders](
[OrderID] [int] NOT NULL,
[ProductID] [int] NOT NULL,
[Quantity] [int] NOT NULL,
[OriginState] [nvarchar](2) NOT NULL,
CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED ([OrderID] ASC,[ProductID] ASC)
)
GO

ALTER TABLE [dbo].[Orders] WITH CHECK ADD CONSTRAINT [FK_Orders_Products] FOREIGN KEY([ProductID])
REFERENCES [dbo].[Products] ([ID])
GO

ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_Products]
GO

INSERT INTO Products VALUES (1, 'PC', 400)
INSERT INTO Products VALUES (2, 'Laptop', 600)
INSERT INTO Products VALUES (3, 'NetBook', 300)

INSERT INTO Orders VALUES (1, 1, 2, 'NC')
INSERT INTO Orders VALUES (2, 2, 1, 'NC')
INSERT INTO Orders VALUES (3, 1, 5, 'WA')
INSERT INTO Orders VALUES (3, 3, 10, 'WA')
INSERT INTO Orders VALUES (4, 2, 4, 'WA')

 

定义作用域和设置服务器

为使服务器数据库做好同步准备,您将需要描述同步作用域并使用与作用域相关的项目来设置服务器数据库。

通过描述同步作用域来定义要同步的内容。同步作用域是必须作为一个单元来同步的一组表。同步作用域中的表可以已存在于数据库中;也可以通过使用 Sync Framework 对象模型描述这些表,然后在设置基础存储区时在运行时生成它们。这里我们将使用服务器数据库中已存在的 Products 表。

数据库设置涉及将与同步作用域相关的项目(例如跟踪表、触发器和存储过程)添加到数据库。这些项目由同步过程在运行时使用。在这个演练中,我们将创建一个控制台应用程序,该应用程序定义名为 ProductsScope 的同步作用域(包括 Products 表),并且使用与同步作用域相关的项目设置在上一步中创建的 SQL Server 数据库。

1. 打开Visual Studio 2008/2010,新建一个控制台应用程序ProvisionServer。并为“解决方案名称”键入 SyncSQLServerAndSQLCompact。

2. 添加对Microsoft.Synchronization.Data 和 Microsoft.Synchronization.Data.SqlServer程序集的引用。

3. 按下面的代码完成该控制台应用程序:

using System.Data.SqlClient;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;

namespace ProvisionServer
{
class Program
{
static void Main(string[] args)
{
//创建数据库连接
SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");

//定义同步作用域ProductsScope
DbSyncScopeDescription scopeDesc = new DbSyncScopeDescription("ProductsScope");

//从SyncDB 服务器数据库检索Products表的架构
DbSyncTableDescription tableDesc = SqlSyncDescriptionBuilder.GetDescriptionForTable("Products", serverConn);

//向同步作用域中添加同步表的描述
scopeDesc.Tables.Add(tableDesc);

//创建一个同步作用域设置对象
SqlSyncScopeProvisioning serverProvision = new SqlSyncScopeProvisioning(serverConn, scopeDesc);

//如果表已经存在则略过创建表的步骤
serverProvision.SetCreateTableDefault(DbSyncCreationOption.Skip);

//开始设置过程
serverProvision.Apply();
}
}
}

4. 运行该控制台程序。

5. 在SQL Server Management Studio中,依次展开 SyncDB 节点和“表”,此时您应会看到设置过程创建的以下附加表:Products_Tracking、schema_info、scope_config 和 scope_info。还有设置过程创建的其他数据库对象,例如触发器和存储过程。

 

设置 SQL Compact 客户端

现在,我们将创建一个名为 SyncCompactDB 的 SQL Server Compact 数据库,并且创建一个控制台应用程序,该应用程序使用与 ProductsScope 相关的项目设置该Compact数据库。设置过程将使客户端数据库做好与服务器进行同步的准备。在前一步骤:定义作用域和设置服务器中,您已使用与同步相关的项目设置了服务器数据库。

创建 SQL Server Compact 数据库

1. 在SQL Server Management Studio 中,单击“文件”菜单,然后单击“连接对象资源管理器”。

2. 在“连接到服务器”对话框中,为“服务器类型”选择 SQL Server Compact Edition。

3. 单击“数据库文件”旁边的向下箭头,然后单击“新建数据库”。

4. 在“创建新的 SQL Server Compact 数据库”对话框中,为“数据库文件名”键入 C:\SyncSQLServerAndSQLCompact\SyncCompactDB.sdf,然后单击“确定”。

5. 在您看到的关于空密码的消息框上单击“是”。

6. 在“连接到服务器”对话框中单击“连接”。

设置 SQL Server Compact 数据库

1. 在上一步骤中创建的SyncSQLServerAndSQLCompact解决方案中添加一个新的控制台应用程序ProvisionClient。

2. 添加对Microsoft.Synchronization、Microsoft.Synchornization.Data、Microsoft.Synchronization.Data.SqlServer、Microsoft.Synchronization.Data.SqlServerCe程序集的引用。

3. 添加对 System.Data.SqlServerCe 程序集的引用。

4. 按下面的代码完成该控制台应用程序:

using System.Data.SqlClient;
using System.Data.SqlServerCe;

using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using Microsoft.Synchronization.Data.SqlServerCe;

namespace ProvisionClient
{
class Program
{
static void Main(string[] args)
{
//创建到SyncCompactDB数据库的连接
SqlCeConnection clientConn = new SqlCeConnection(@"Data Source='D:\Sync Framework\CompactDB\SyncCompactDB.sdf'");

//创建到SyncDB服务器数据库的连接
SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");

//从SyncDB服务器数据库中获取ProductsScope同步作用域
DbSyncScopeDescription scopeDesc = SqlSyncDescriptionBuilder.GetDescriptionForScope("ProductsScope", serverConn);

//基于ProductsScope同步作用域创建CE设置对象
SqlCeSyncScopeProvisioning clientProvision = new SqlCeSyncScopeProvisioning(clientConn, scopeDesc);

//开始设置过程
clientProvision.Apply();
}
}
}

5. 运行该控制台程序。

6. 在SQL Server Management Studio中,依次展开 SQL Server Compact [My Computer\...\SyncCompactDB] 节点和“表”,此时您应会看到设置过程创建的以下附加表:Products_Tracking、schema_info、scope_config 和 scope_info。还有设置过程创建的其他对象,例如触发器和存储过程。

执行同步

在前面的步骤中,您准备了服务器数据库 SyncDB 和Compact数据库 SyncCompactDB 以便进行同步。现在我们将创建一个控制台应用程序,该控制台应用程序将真正开始这两个数据库之间的同步过程。

1.  为SyncSQLServerAndSQLCompact解决方案添加一个新的控制台应用程序,项目名称为ExecuteCompactSync。

2.  添加对Microsoft.Synchronization、Microsoft.Synchornization.Data、Microsoft.Synchronization.Data.SqlServer、Microsoft.Synchronization.Data.SqlServerCe程序集的引用。

3.  添加对 System.Data.SqlServerCe 程序集的引用。

4.  按下面的代码完成该控制台应用程序:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlServerCe;

using Microsoft.Synchronization;
using Microsoft.Synchronization.Data;
using Microsoft.Synchronization.Data.SqlServer;
using Microsoft.Synchronization.Data.SqlServerCe;

namespace ExecuteCompactSync
{
class Program
{
static void Main(string[] args)
{
//创建到SyncCompactDB database的连接
SqlCeConnection clientConn = new SqlCeConnection(@"Data Source='D:\Sync Framework\CompactDB\SyncCompactDB.sdf'");

//创建到SyncDB服务器数据库的连接
SqlConnection serverConn = new SqlConnection("Data Source=localhost; Initial Catalog=SyncDB; Integrated Security=True");

//创建同步代理(sync orhcestrator)
SyncOrchestrator syncOrchestrator = new SyncOrchestrator();

//设置同步代理的本地同步提供程序为SyncCompactDB compact database的ProductsScope
syncOrchestrator.LocalProvider = new SqlCeSyncProvider("ProductsScope", clientConn);

//设置同步代理的远程同步提供程序为SyncDB server database的ProductsScope
syncOrchestrator.RemoteProvider = new SqlSyncProvider("ProductsScope", serverConn);

//设置同步会话的同步方向为Upload和Download
syncOrchestrator.Direction = SyncDirectionOrder.UploadAndDownload;

//侦听本地同步提供程序的ApplyChangeFailed事件
((SqlCeSyncProvider)syncOrchestrator.LocalProvider).ApplyChangeFailed += new EventHandler<DbApplyChangeFailedEventArgs>(Program_ApplyChangeFailed);

//执行同步过程
SyncOperationStatistics syncStats = syncOrchestrator.Synchronize();

//输出统计数据
Console.WriteLine("Start Time: " + syncStats.SyncStartTime);
Console.WriteLine("Total Changes Uploaded: " + syncStats.UploadChangesTotal);
Console.WriteLine("Total Changes Downloaded: " + syncStats.DownloadChangesTotal);
Console.WriteLine("Complete Time: " + syncStats.SyncEndTime);
Console.WriteLine(String.Empty);
}

static void Program_ApplyChangeFailed(object sender, DbApplyChangeFailedEventArgs e)
{
//显示冲突类型
Console.WriteLine(e.Conflict.Type);

//显示错误信息
Console.WriteLine(e.Error);
}

}
}

5.  在“解决方案资源管理器”中,将ExecuteCompactSync项目设置为启动项目。

6.  执行该控制台应用程序,你应该能看到如下输出。可以看到,位于 SyncDB 服务器数据库的 Products 表中的三条记录已经下载到Compact客户端数据库中了,我们可以在SSMS中进行确认。

7.  在 SQL Server Management Studio 中,为SyncDB服务器数据库的Products表添加一条记录:(ID=4,Name=” Wireless Mouse”,ListPrice=45)。

8.  在 Visual Studio 中,再次执行同步客户端程序。您应该看到如下输出。我们可以在SSMS中确认该条新记录是否已经同步至Compact客户端数据库了。

我们可以通过在服务器/客户端添加/更新/删除记录,反复试验以便熟悉Sync Framework技术。例如,如果您从服务器删除一条记录,则在您下次将客户端与服务器同步时,应该删除客户端数据库中相应的记录。如果在客户端添加记录,同步时也会上传到服务器数据库。

应园友的要求,本解决方案的源代码已经上传,需要的朋友请点此下载。运行时请参照文中的具体步骤与前提条件,比如数据库的创建等。

posted @ 2012-03-09 13:44  Life a Poem  阅读(6994)  评论(15编辑  收藏  举报