C#数据库同步应用程序标识问题

时间:2015-05-29 19:17:31

标签: c# sql-server database sqlite sync

我尝试在C#应用程序中同步SQL Server和SQLite(数据库结构匹配)之间的数据。

该应用程序能够更新,添加,删除信息,掌上电脑(motorola rfidreader)也是如此,因此,或者可能已经更新了信息,应用程序也不知道直到同步开始。

我的问题在于知道数据库中的哪些行已被添加/删除/或更新。我有一个历史表,可以跟踪CRUD操作何时发生,但每个数据库中唯一的唯一标识符是自动递增的ID列。

问题是,如果我在掌上电脑上添加了一行,然后尝试同步这两个数据库,并在服务器上添加一行,那么ID值(可能)将会关闭。这意味着我无法搜索ID,并且期望ID能够正确地匹配两个数据库。数据库之间不匹配的ID也将取消删除和更新功能,因为我不知道我是否正在处理正确的行项目。

如何同步这两个数据库并保持ID完整?

到目前为止,我提出的唯一解决方案(并且我不相信它是最佳选择)是在服务器数据库中有一个表,用于在同步时跟踪任何ADDS。非常重要的是,有一个列可以使用该表,HandheldRowID和相应的ServerRowID - 所以我与每个表都有连接,以防万一它们没有正确匹配

1 个答案:

答案 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列上的自动增量,因为服务器处理了它。

当然,这个过程可以扩展(尽管更复杂)到多个手持设备。

使用GUID / UniqueIdentifiers

如果您可以使用IdGUID作为PK,那么此过程非常简单。只需合并更改即可。任何uniqueidentifier值重叠的可能性都很小甚至没有。

我最喜欢的引文(来自维基百科文章):

  

它们可能是也可能不是由随机(或伪随机)数字生成的。从随机数生成的GUID通常包含6个固定位(这些指示GUID是随机的)和122个随机位;独特的这种GUID的总数是2 122 (大约5.3×10 36 )。这个数字太大,以至于随机产生两次相同数字的概率可以忽略不计;但是其他GUID版本具有不同的唯一性属性和概率,从保证唯一性到可能的重复。假设统一概率简单,如果2014年全球每个人拥有6亿个GUID,则一个重复的概率约为50%。

GUID参考:

StackOverflow Question on Generation Algorithm

Wikipedia Article with some Good Stats