快速业务通道

微软同步框架(MSF)入门之二--增量和修改同步方式

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-19
t_posts1);   this.dnt_post1TableAdapter.Dispose();

//然后是将本地数据同步到远程数据服务器

  BiDirectSyncDataSyncAgentSyncAgent=new BiDirectSyncDataSyncAgent();
  SyncAgent.dnt_posts1.SyncDirection=Microsoft.Synchronization.Data.SyncDirection.Bidirectional;
  SyncAgent.Synchronize();

上面代码中的SyncDirection可谓至关重要,在前文中我曾说过,MSF做数据同步时有四种方式,依次是(这里只为加深印象):

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

DownloadOnly:首次同步期间,客户端通常从服务器下载架构和一个初始数据集。执行后续同步时,客户端从服务器下载更改。

Snapshot: 客户端将从服务器下载一个数据集。每次同步期间,这些数据都将完全刷新。

UploadOnly: 首次同步期间,客户端通常从服务器下载架构。执行后续同步时,客户端将更改上载到服务器。

因为MSF设计器默认是Snapshot方式,所以是不支持同步(上传)远程的。所以我们这里使用了Bidirectional(双向同步),这样我们先将本地修改的数据上传到远程之后,再将远程上的数据修改下载到本地。

整个操作流程是这样的(首先在本地修改变相应数据):

微软同步框架(MSF)入门之二--增量和修改同步方式

微软同步框架(MSF)入门之二--增量和修改同步方式

然后同步到远程数据服务器上:

微软同步框架(MSF)入门之二--增量和修改同步方式

当然如果此时远程服务器上有一行记录(注:与本地修改的记录不是同一主键pid),这条记录的修改值也会同步到本地数据文件(sdf)中。

有经验的朋友看到这里会发现一个问题,就是假设如果我在本地修改某一数据行时,此时在远程数据库中有一个用户也在修改相同的一行数据(同一个主键pid)。那当我们进行从本地向远程的双向同步时,最终下载到本地数据文件中的远程数据会是那个值呢?

其中这里MSF的判断是以优先级来决定最终使用那一方的数据的。而优先级毫无一问是远程数据优先级要高。所以最终我们在本地修改的数据会被远程修改的数据所“覆盖”。MSF默认是这样的,但如果我们就是想让本地的优先级要大于远程,换句话说就是想用本地数据“覆盖”远程的相同主键相同字段值的时候,该如何办呢?

其实这里有一个很BT的方式,就是手工修改MSF为我们生成的相关应文件。在本DEMO中,我们修改的是BiDirectSyncData.Designer.cs文件中的这一行(line 189)代码,原文如下:

this.UpdateCommand.CommandText = @"UPDATE dbo.dnt_posts1 SET [fid] = @fid, [tid] = @tid,
[parentid] = @parentid, [layer] = @layer, [poster] = @poster, [posterid] = @posterid,
[title] = @title, [postdatetime] = @postdatetime, [message] = @message, [ip] = @ip,
[lastedit] = @lastedit, [invisible] = @invisible, [usesig] = @usesig, [htmlon] = @htmlon,
[smileyoff] = @smileyoff, [parseurloff] = @parseurloff, [bbcodeoff] = @bbcodeoff,
[attachment] = @attachment, [rate] = @rate, [ratetimes] = @ratetimes, [LastEditDate] = @LastEditDate,
[CreationDate] = @CreationDate WHERE ([pid] = @pid) AND
(@sync_force_write = 1 OR ([LastEditDate] <= @sync_last_received_anchor))
SET @sync_row_count = @@rowcount";

大家看到没有,在上面的SQL语句中有这样一段内容(倒数第二行):

(@sync_force_write = 1 OR ([LastEditDate] <= @sync_last_received_anchor))

我们只要将@sync_force_write修改为1(让条件永远为真),或干脆将这段内容全部删除。这样就会将我们本地的修改全部提交到远程数据库中并最终完成对数据库中相同数据行的覆盖。

好了,今天的

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号