在服务器和多个客户端之间同步数据库更

时间:2015-07-29 06:27:27

标签: c# sql-server database sync

我有一个主SQL Server数据库(在线托管),它可以同步并向多个客户端提供数据(这些客户端依次处理相同的数据)。某些客户端将不断连接到Internet(并且可以立即与主服务器同步),但其他客户端将无法访问某些时间段的数据库(一次最多几天)。 我在每台机器上都有一个本地的MS Access数据库(主要是在这个数据库上工作,并且可以与主机同步),我想知道如何将所有内容同步在一起并且不丢失任何数据?有些客户端连接数天不会连接,并且可能会编辑与常连客户端相同的行,如何在连接到互联网时进行同步,以便不会丢失所有客户端之间的数据?

由于与MS Access文件和SQL服务器数据库不兼容,我计划将所有数据带到DataTables并在将信息发送回数据库之前对其进行管理(因此,它会使sql server更改跟踪不可能)。我听说过微软的Sync Framework(但到目前为止还没有找到)。我确实考虑过在计算机上本地手动存储已执行的语句,然后在连接到互联网时执行它们(但这可能会覆盖那些从未有机会同步的旧数据的新数据)。我不知道该怎么做,如果我能解决这些问题,我将不胜感激。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

不是一个全面的答案,但这个评论太长了:

程序员必须提出理智的合并规则,这些规则适用于数据类型并且是用户期望的,并且必须创建他的框架以支持这些规则的合并。没有Plan X适用于每一段数据。

三种不同的值类型,每种都有一个示例,只有程序员才能根据他对数据的了解来决定。

例如int:客户端A和客户端B获取值1。 它可能包含最后一个值:客户端A在7月28日编辑为4,并在8月2日与服务器同步。客户B于7月29日编辑为3,并于7月29日同步。服务器最终应该包含哪一个?如果客户端C在客户端A同步之前得到3并且编辑为7,该怎么办? 当然它也可能是一个计数器:客户端A已添加3,客户端B已添加2,并且在两者同步后,服务器应包含6。

日期值:客户A在7月28日编辑并在8月2日同步,客户B在7月29日编辑并在7月29日同步。可能的两个简单值:可能是LastEditOn字段,它应该包含客户端B设置的日期,或者LastSyncOn字段,它应该包含客户端A设置的日期。

文本字段:两个客户端都获得“文本”。 客户端A在7月28日更改为“SomeText”,并在8月2日更改为同步。 客户B于7月29日更改为“TextEtc”,并于7月29日同步。

根据您的需要,您可以合并到:

  • TextEtc
  • SomeText
  • SomeTextEtc
  • SomeText
    B不可合并编辑:TextEtc
  • 文本
    编辑A:SomeText
    由B编辑:TextEtc
  • 文本
    由B编辑:TextEtc
    由A编辑:SomeText

仅列举几种可能性。

你知道,程序员还不是多余的。对于每种记录类型和每个数据,您必须决定如何将所有可能的更改合并为一个合理的新单值。 这是我们无法为您做的,因为我们不知道您的数据到底是什么。

我们可以说:你肯定需要一个记录最后一次更改的日期。您可能还需要上次更改某些字段的日期,或上次与服务器同步时包含的某些字段。

如果无法进行合理的合并,则必须使用锁定。某个客户端只能在服务器上锁定该数据时更改一条数据。由于客户可能会介于两者之间,因此您的锁只能保留一段时间。