需求:
1、现有一台Server装有ServerDB;Client若干,每台都装有ClientDB。
2、Client端有UI,执行上传,可以将ClientDB数据上传到ServerDB。
要求:
1、.net环境下用代码的方式实现,不希望使用数据库本身的同步机制。
2、使用的SqlServer数据库。 用其中的一张表,举例说明:
IDKey 主键 uniqueidentifier
MchID Client端的编号 int
Field1 其它字段
Field2 其它字段
Field3 其它字段
...... 需要注意的问题:
已经上传过的数据有可能在本地被修改过,也有可能被删除。也就是说本地执行上传后,Server上的数据要和本地一致。

解决方案 »

  1.   

    你可以参考codeplex上的一个开源项目
    http://syncdbmssql.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=12614我虽然没有测试过,但大致看过这个代码,它是通过sqlserver的smo当中的DependencyWalker相关功能实现的。
      

  2.   

    我们是 wcf 传输操作的
      

  3.   

    这种应用场景,每次每客户端同步后要记日志:记录同步的时间;最大Id;
    你的表设计要做些调整: 数据表增加2个个字段;
    1:lastUpdateTime 时间戳,最近更新时间;知道哪些记录被修改
    2:Deleted 是否已被删除; 知道哪些记录被修改新增记录是根据日志可确定哪些是新记录;同步的内容分3部分来实现:
    1.客户端新增的记录
    2.客户端修改的记录
    3.客户端删除的记录如果数量量大,或要求同步的可靠性,如同步过程中,同步未完成,数据连接断了。日志功能就强大一些;
    按每行记录(Id)来确定是不是已经同步成功来记日志。一旦中间失败,根据日志可以知道哪些已经完成了。
      

  4.   

    期待有更好的解决方案!
    另外:我的需求中,Client端的用户比较少的,同时执行上传得可能性不大.
      

  5.   

    我曾经做了一个,但在字段之间有约束关系时问题会比较多。
    你可以给每个表追加一个字段交行ID(guid),用于唯一标示行。
    客户端程序每次删除、更新、追加任何一条记录,采用如下结构进行保存
    我曾经做了一个,但在字段之间有约束关系时问题会比较多。
    你可以给每个表追加一个字段交行ID(guid),用于唯一标示行。客户端程序每次删除、更新、追加任何一条记录,
    采用如下结构进行保存
    ID---行ID,唯一标示行
    Action---动作类型,Insert,Delete,Update
    记录客户端操作数据库的流水。然后用上传程序,执行你记录的流水日志,清除成功执行的流水,如果中途有执行出错,不执行后续流水。---------------------------------------------------------
    你这个同步还是单向的还相对简单,我们现在遇到双向同步也就是服务器端也需要更改,问题就很复杂了
      

  6.   

    思路其实不难,实现起来有些繁琐,首先无论是S 还是C 端得所有表 都必须有 ts 时间戳和 dr 删除标识 才方便操作:
    注意:
    客户端每次修改一条数据必须更新ts,删除数据的话dr 写入状态并不要真正删除。
    方案:
    查询server端数据与客户端数据 主键 一致 但是 ts 不一致的 说明次行数据已经更新;执行同步更新操作。不知是否能够给楼主提供一点思路。