在Teched2008上听了一节关于MSF(Microsoft Sync Framework 微软同步框架),这一框架允许
开发者创建离线式的应用、设备和服务,可以与任何应用的任意类型数据进行集成。

有关这个模架的介绍在网上有一些链接,而园子里也有朋友做过这方面的介绍。当时东西好不好,只有
用过才会知道。今天这篇文章就是简单试用一把MSF来开发ADO.NET同步的DEMO(当然其也支持文件和文
件夹的同步,我会在以后写文介绍研究心得)。因为是初次使用,所以截图多了一些,当然在概念理解上也
可能有偏差,有这方面开发经验的朋友欢迎指正。

好了,开始正文吧。

在开发本应用之前,假设您已下载并安装了相应的MSF框架服务包和SDK,如果没安装的朋友请自行
下载并安装,下载链接。

本人下载安装的是:SyncSetup_zh-CHS.x86.zip
   (因为本文的VS是中文的,所以就使用了Microsoft Sync Framework v1.0 - 简体中文)

当然,目前该框架的最新版本是Sync Framework v2 CTP1(目前暂无中文开发包,且不支持在1.0
和2.0版本之间的组件协同操作Interoperability)。

首先,我们需要了解一下该框架实现ADO.NET同步的实现原理。请看下图:

我们可以看到在客户端数据库(SqlServerCompact3.5)与服务端数据(Server Database)之间是
提供了一组(两个)Provider,分别是ClientSyncProvider和ServerSyncProvider, 其中:

    ClientSyncProvider用于:
     提取(供)与客户端数据存储区(SqlServerCompact3.5)进行通信并将同步代理(SyncAgent)
与该数据存储区的特定实现隔离的客户端同步提供程序。说明白了就是该对象用于与本地数据存储区
进行通信。

ServerSyncProvider用于:
     提取(供)与服务器数据存储区(Server Database)进行通信并将同步代理与该数据存储区的
特定实现隔离的一般服务器同步提供程序。该对象用于与远程数据存储区进行通信。

这两个对象会通过下面的SyncAgent类以属性方式来提供:)

而图中的SyncAgent用于对象组织同步过程。其中的:

    Synchronize() 方法会在本地和远程数据存储之间同步数据(下面会用到)。
     LocalProvider 属性:  获取或设置一个派生自 ClientSyncProvider 的对象。 
     RemoteProvider 属性: 获取或设置一个派生自 ServerSyncProvider 的对象。

图中的SyncTable对象表示在同步过程中涉及的表的客户端设置。比如我们可以通过SyncDirection
属性来设置该值表示相对于客户端的同步方向,其类型为枚举,包括如下几个值:

    Bidirectional:首次同步期间,客户端通常从服务器下载架构和一个初始数据集。执行后续同步时,
                   客户端将更改上载到服务器,然后从服务器下载更改。 
     DownloadOnly: 首次同步期间,客户端通常从服务器下载架构和一个初始数据集。执行后续同步时,
                   客户端从服务器下载更改。 
     Snapshot:  客户端将从服务器下载一个数据集。每次同步期间,这些数据都将完全刷新(本文演示) 
    UploadOnly:   首次同步期间,客户端通常从服务器下载架构。执行后续同步时,客户端将更改上
                   载到服务器。 

图中的SyncAdapter用于提供一组数据命令,这些命令用于获取架构信息以及在服务器数据库中检索
和应用更改(通过SQL语句或存储过程)。

当然上图中的结构有些复杂,涉及到的类多了一些。但我们不用手工来写这些代码。只要按照操作
导航一步步走下来,就会生成这个类了。下面就以一个快照方式(Snapshot)来开发一个DEMO来大概了
解一下相应的操作流程。

首先,我们需要新建一个"Windows窗体应用程序", 项目名称随个人喜好。

然后在生成的解决方案浏览器中右击“添加”-->“新建项”,打开新建项窗口,然后找到“本
地数据库缓存”图标项,设置如下:
     
     

然后单击“添加”,进入“配置数据同步”对话框,在该对象框中我们将完成远程数据库与本地
数据库(如没有则要新建)的相关信息绑写。首先要设置“服务器链接”(这块类型于SQLSERVER链接
登陆,这里就不多说了)。然后是设置客户端链接,如下图:

在新建并设置密码(可选项,本DEMO中未设置密码)之后单击“确定”,这时在“配置数据同步”
窗口中就会显示我们新建的本地SQLCE数据库文件,然后按下图进行相应设置:

然后单击“添加”按钮,在“配置供脱机使用的表”窗口中设置相应的表格,本DEMO中因为只同步
主题表(dnt_topics),所以只选中了该表,然后在“要下载的数据”下拉框中选择“每次更新整个表”
(此处设置对应前面所说的SnapShot快照方式,当然我们可在项目生成之后在代码中手工修改)。下图:

然后我们单击“确定”按钮。这样我们就把刚添加的表添加到了当前设置中,然后在“配置数据同步”
窗口中单击“确定”按钮之后,进入“数据源配置”向导,在这个窗口中来对主题表进行更细致的设置,如
下图所示:

然后单击“完成”按钮,即完成了向导的设置和代码生成工作。在初始化完成之后,我们需要定义
一个WINFORM来显示我们同步的数据,其界面截图如下:

图中我们在数据窗口中放置了一个DataGridView控件,然后该控件上右击“属性”,然后在该控件
“属性列表”中的DataSource进行如下图设置:

通过该项设置,设计器会为我们生成下面这一行代码:

this.dnt_topicsTableAdapter.Fill(this.localDataSet_Topic.dnt_topics);

其中的dnt_topicsTableAdapter即是本地数据(SQLCE)的数据适配器,通过它即完成了向指写数据集
(LocalDataSet_Topic)中的数据表(dnt_topics,这里为dnt_topicsDataTable类型,其父类为Typed-
TableBase)的数据填充。

当然上面所说明的“dnt_topicsTableAdapter”“localDataSet_Topic”“dnt_topics”均是由设计器生
成的,正如前面分析模型图时所说的那样,设计器基本上生成了图中的所说的所有类(分布于下载源码项目
中的LocalDataSet_Topic.Designer.cs和SyncSnapData.Designer.cs两个文件中)。前面所说的
SnapShot(快照方式)的设置也在SyncSnapData.Designer.cs文件中进行设置,如下:

public partial class dnt_topicsSyncTable : Microsoft.Synchronization.Data.SyncTable {
            
       
      [System.Diagnostics.DebuggerNonUserCodeAttribute()]
      private void InitializeTableOptions() {
          this.TableName = "dnt_topics";
          //此处可以修改成其它三种方式:Bidirectional,DownloadOnly,UploadOnly
          //当然在数据逻辑上也要有相应修改变
          this.SyncDirection = Microsoft.Synchronization.Data.SyncDirection.Snapshot;
          this.CreationOption = Microsoft.Synchronization.Data.TableCreationOption.
                 DropExistingOrCreateNewTable;
      }
}

下面的方法用于将数据填充到相应的数据集中将完成向DataGridView控件的绑写:

        private void LoadData()
        {
            this.dnt_topicsTableAdapter.Fill(this.localDataSet_Topic.dnt_topics);
            SnapDatasView.AutoGenerateColumns = true;
            SnapDatasView.DataSource = this.localDataSet_Topic.dnt_topics;
            this.dnt_topicsTableAdapter.Dispose();
        }

当然,上面只是获取数据的一种方式,我们也可以通过下面的直接方式来连接本地SQLCE数据
库来执行相应的SQL语句,如下:

     SyncSnapDataClientSyncProvider clientSynProvider = new SyncSnapDataClientSyncProvider();
      SqlCeConnection scc = new SqlCeConnection(clientSynProvider.ConnectionString);
      SqlCeDataAdapter scda = new SqlCeDataAdapter("SELECT * FROM [dnt_topics] ORDER BY [tid] ASC", scc);
      DataSet ds = new DataSet();
      scda.Fill(ds);
      SnapDatasView.AutoGenerateColumns = true;
      SnapDatasView.DataSource = ds.Tables[0];
      scda.Dispose();
      scc.Close();

有了这些方法之后,我们还要写一下同步数据的代码,下面的两行代码即完成了将远程SQLSERVER服务器
上的数据同步到本地SQLCE数据库的任务:

    SyncSnapDataSyncAgent syncAgent = new SyncSnapDataSyncAgent();
    // 调用 SyncAgent.Synchronize() 以启动同步过程,同步仅更新本地数据库。  
     Microsoft.Synchronization.Data.SyncStatistics syncStats = syncAgent.Synchronize();

其中的SyncStatistics用于获得此次同步的一些统计数据信息,如:

     DownloadChangesFailed:从服务器下载的无法在客户端应用的更改数
     TotalChangesDownloaded:从服务器下载的更改总数[其中包括无法在客户端应用的更改]
     TotalChangesUploaded:从客户端上载的更改总数[其中包括无法在服务器上应用的更改]
     DownloadChangesFailed:从服务器下载的无法在客户端应用的更改数
     

好了,开发代码基本完成了,下面运行一下程序(F5):

我们单击“加载本地数据”按钮(之前需要首次同步数据),如下图:
   

数据显示当前tid=601的数据行,其fid为190.
     这里我们用SQL企业管理器打开远程数据服务器,将相应的tid数据行的fid字段修改为“290(新值)”。
这里,我们在当前DEMO程序中再次单击“加载本地数据”按钮按钮时,数据依旧是“190(旧值)”,原因
在于本地的数据库还用的是旧数据,而不是远程的新数据。所以我们需要同步一下,点击“同步到本地”按钮
后,我们就会看到新的数据已被下载到本地显示了。如下图:
     

好了,今天的DEMO就先到这里了,当然还有一些内容没说,比如设计器所生成的代码和数据同步的另外三
种方式,以及文件同步等内容我会在后续章节中加以说明。

原文链接:http://www.cnblogs.com/daizhj/archive/2008/11/13/1332594.html

作者: daizhj, 代震军

Tags: 微软同步框架,ado.net,sqlce

网址: http://daizhj.cnblogs.com/

源码下载,请点击这里.

转载于:https://www.cnblogs.com/daizhj/archive/2008/11/13/1332594.html

微软同步框架入门开篇(附SnapShot快照Demo)相关推荐

  1. 微软同步框架入门之四--冲突(Conflict)检测和处理

    检测和处理微软同步框架(MSF)入门之四--冲突(Conflict)检测和处理     在几篇文章当中,我介绍了 SnapShot(快照方式)和"只同步新更改和增量更改"这两种同步 ...

  2. 微软同步框架入门之五--使用WCF同步远程数据

    在之前介绍的两个DEMO中,链接远程服务器所使用的方式都是通过数据库链接串.虽然可以简单的实现所期望的数据同步功能,但这样做有两个问题: 1.不适合进行分布式布署.          2.安全方面存在 ...

  3. Microsoft Sync Framework 系列(三):微软同步框架出现背景及要解决的问题

    持续连接的C\S,B\S系统存在固有的缺陷,偶尔连接系统(OCA)在试图解决这些问题的同时又引入了新的问题.开发offline系统存在很多挑战,这些挑战都是 Microsoft Sync Framew ...

  4. Dubbo分布式服务框架入门(附工程)

    要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比如我想开发一个网上商城项目,这个网上商城呢,比较复杂,分为pc端web管理后台,微信端销售公众号,那么我们分成四个项目,pc端网站,微 ...

  5. 话说微软刚出的同步框架Sync Services

    前言:      Sync Services For ADO.NET 这个版本的同步框架已经出来好久了,现在已经是CTP2的版本了,但它一直都是只针对桌面应用,没有针对移动设备.但3月份的时候针对移动 ...

  6. python爬虫简单实例-最简单的Python爬虫案例,看得懂说明你已入门,附赠教程

    原标题:最简单的Python爬虫案例,看得懂说明你已入门,附赠教程 这是最简单的Python爬虫案例,如果你能看懂,那么请你保持信心,因为你已经入门Python爬虫,只要带着信心和努力,你的技术能力在 ...

  7. [图解tensorflow源码] 入门准备工作附常用的矩阵计算工具[转]

    [图解tensorflow源码] 入门准备工作 附常用的矩阵计算工具[转] Link: https://www.cnblogs.com/yao62995/p/5773142.html tensorfl ...

  8. 前端学习笔记:Bootstrap框架入门

    前端学习笔记:Bootstrap框架入门 一.Bootstrap概述 1.基本信息 ​Bootstrap,来自 Twitter,是目前很受欢迎的前端框架.Bootstrap 是基于 HTML.CSS. ...

  9. Netty框架入门案例,代码示例

    Netty框架入门案例 pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns ...

最新文章

  1. 记一次mapreduce读取不到输入文件的问题
  2. mysql迭代查询并分页_mysql 数据库 分页查询优化
  3. 二元查找树的后序遍历结果
  4. 0831 - 每晚放松一刻
  5. 4.1 编程语言的几个发展阶段
  6. 【推荐系统】BERT4Rec:使用Bert进行序列推荐
  7. jboss:在standalone.xml中设置系统属性(system-properties)
  8. android launcher3 home页简易分析
  9. 利用TreeWalk提高网速及其在vista中的安装方法
  10. WordPress强大多功能主题模板The7 v9.16.0 已激活版本完全兼容大多数插件
  11. Linux系统平均负载的含义
  12. 点云分割中Proposal-based Methods与Proposal-free Methods
  13. VIVO应用市场APP上架总结
  14. Unity游戏开发客户端面经——Unity(初级)
  15. 网页设计教程:从设计到制作过程
  16. 如何在Mac电脑上删除APFS分区?
  17. 【PAT(甲级)】1063 Set Similarity(题目意思)
  18. 复旦大学陈怡然:文本摘要的跨数据集迁移研究
  19. 扶持初创企业成长 佳能再度携手优客工场升级轻松办公新体验
  20. 透析Spring2---第三章试读

热门文章

  1. 优秀渗透工具资源整理(持续更新)
  2. Mysql 会导致锁表的语法
  3. TensorFlow学习笔记(一)安装、配置、基本用法
  4. 新闻标题 静态分页 (无刷新)
  5. Oracle的不完全恢复
  6. LINQ to Entities 不支持 LINQ 表达式节点类型“ArrayIndex”
  7. Oracle 监听配置详解(转载)
  8. Python基础教程学习笔记:第二章 列表和元组
  9. PHP + Redis 实现一个简单的twitter
  10. 一起谈.NET技术,C# 中奇妙的函数之ToLookup