我尝试在C#应用程序中同步SQL Server和SQLite(数据库结构匹配)之间的数据。
该应用程序能够更新,添加,删除信息,掌上电脑(motorola rfidreader)也是如此,因此,或者可能已经更新了信息,应用程序也不知道直到同步开始。
我的问题在于知道数据库中的哪些行已被添加/删除/或更新。我有一个历史表,可以跟踪CRUD操作何时发生,但每个数据库中唯一的唯一标识符是自动递增的ID列。
问题是,如果我在掌上电脑上添加了一行,然后尝试同步这两个数据库,并在服务器上添加一行,那么ID值(可能)将会关闭。这意味着我无法搜索ID,并且期望ID能够正确地匹配两个数据库。数据库之间不匹配的ID也将取消删除和更新功能,因为我不知道我是否正在处理正确的行项目。
如何同步这两个数据库并保持ID完整?
到目前为止,我提出的唯一解决方案(并且我不相信它是最佳选择)是在服务器数据库中有一个表,用于在同步时跟踪任何ADDS。非常重要的是,有一个列可以使用该表,HandheldRowID
和相应的ServerRowID
- 所以我与每个表都有连接,以防万一它们没有正确匹配
答案 0 :(得分:0)
IF 您无法更改PK字段类型(如我的评论中所示,我建议您使用uniqueidentifier
列)然后您(一如既往)有两个选项。我将首先强调我最喜欢的。
为了保留参照完整性以及自动递增 Id
字段,您应该使用state
表保存history
。然后在工作完成时在两个数据库之间开始合并。手持设备应将其history
表发送到服务器,服务器应进行适当的更改并通知手持设备需要进行的任何特定修改。
掌上电脑上的history
表格示例:
Table Action Id
-----------------------
A Add 1502
A Edit 1502
A Delete 134
服务器上的相同表:
Table Action Id
-----------------------
A Add 1502
A Delete 138
现在,您和我都知道两台设备上的表格1502
中的记录A
不是同一记录。那么我们告诉服务器该怎么办? / p>
嗯,服务器应该只接收设备history
表,然后枚举其中的每个操作。在Add
上,它应该创建它自己的自动递增的Id
值(在这种情况下为1503
)。然后,它将将该记录添加到其history
表中,并使用新的Id
。完成后,它将从客户端设备请求该记录的实际数据,并将其保存到表中。
然后,服务器将看到相同Edit
的{{1}}记录,并将其丢弃。 (记录编辑时没有任何意义,我们已经有了最新版本。)
然后服务器会看到Id
记录,并从它自己的数据库中删除Remove
。然后它会在Id
表中添加一条记录。
完成所有这些操作(并将记录添加到服务器上的history
表)后,它会将其history
表的副本发送到掌上电脑,然后应用相同的更改。注意:掌上电脑应该回滚它所做的更改。 (如果存在history
,则Add 1502
。)然后它将收到服务器的更改副本。一旦完成,它将执行服务器所做的相同的事情,除了它不必担心Remove 1502
列上的自动增量,因为服务器处理了它。
当然,这个过程可以扩展(尽管更复杂)到多个手持设备。
如果您可以使用Id
或GUID
作为PK,那么此过程非常简单。只需合并更改即可。任何uniqueidentifier
值重叠的可能性都很小甚至没有。
我最喜欢的引文(来自维基百科文章):
它们可能是也可能不是由随机(或伪随机)数字生成的。从随机数生成的GUID通常包含6个固定位(这些指示GUID是随机的)和122个随机位;独特的这种GUID的总数是2 122 (大约5.3×10 36 )。这个数字太大,以至于随机产生两次相同数字的概率可以忽略不计;但是其他GUID版本具有不同的唯一性属性和概率,从保证唯一性到可能的重复。假设统一概率简单,如果2014年全球每个人拥有6亿个GUID,则一个重复的概率约为50%。