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技術。例如,如果您從服務器刪除一條記錄,則在您下次將客戶端與服務器同步時,應該刪除客戶端數據庫中相應的記錄。如果在客戶端添加記錄,同步時也會上傳到服務器數據庫。
應園友的要求,本解決方案的源代碼已經上傳,需要的朋友請點此下載。運行時請參照文中的具體步驟與前提條件,比如數據庫的創建等。

浙公網安備 33010602011771號