在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. ASP.NET CORE之上传文件夹
  2. SpringMVC的简单知识
  3. win10安装tensorflow (cpu版)
  4. 正则表达式的非捕获性分组
  5. BP神经网络识别手写数字项目解析及matlab实现
  6. python转换窗口无响应_Tkinter窗口显示(没有响应),但代码正在运行
  7. python中对文件进行读和写
  8. chromedriver放在哪个目录下_Windows下ThinkPHP与Linux互通
  9. 【推荐实践】强化学习算法在京东广告序列推荐场景的应用
  10. C++算法学习(回溯算法)
  11. python研究背景与意义_立体匹配的研究背景以及意义
  12. 人工智能学习思维导图
  13. USB接口定义详解(图)
  14. 渐变色【R Color】
  15. 微信小程序开发(创建项目介绍)
  16. sqllabs详解与知识点汇总(内含代码审计)
  17. 一个点的经度和纬度,以这个点为圆心,1000米为半径,最大的经度和纬度,最小的经度和纬度...
  18. Python如何读取STL文件,生成STL文件预览图(缩略图)
  19. Firefox 使用常见问题和解决方法
  20. Common Weakness Enumeration (CWE) 2021 Lastest

热门文章

  1. 基础练习 数列排序 c语言
  2. trident原理及编程指南
  3. Hadoop常见异常及其解决方案
  4. 【solr专题之一】Solr快速入门
  5. 服务化实战之 dubbo、dubbox、motan、thrift、grpc等RPC框架比较及选型
  6. JSON学习笔记(四)- JSON.parse()
  7. 使用 TDD 测试驱动开发来构建 Laravel REST API
  8. Ubuntu首次登入与在线求助man page总结
  9. zabbix常用配置
  10. Oracle——17概要文件