sql server-C#数据库同步应用程序标识问题
本文关键字:标识 问题 应用程序 同步 server-C# 数据库 sql | 更新日期: 2023-09-27 17:51:06
我正在尝试在C#应用程序中的SQL Server和SQLite(数据库结构匹配的地方(之间同步数据。
该应用程序可以更新、添加、删除信息,手持设备(motorola rfidreader(也可以,因此或者可能已经更新了信息,在同步开始之前,应用程序不会知道。
我的问题是知道数据库中的哪一行已被添加/删除/更新。我有一个历史表,可以跟踪CRUD操作何时发生,但每个数据库中唯一唯一的标识符是一个自动递增的ID列。
问题是,如果我在掌上电脑上添加了一行,然后尝试同步两个数据库,并在服务器上添加一行,ID值(可能(会关闭。这意味着我无法搜索ID,并且希望ID 100%与两个数据库正确匹配。数据库之间不匹配的ID也会使Remove和Update函数失效,因为我不知道我是否在处理正确的行项目。
如何同步这两个数据库并保持ID不变?
到目前为止,我想出的唯一解决方案(我不相信这是最好的选择(是在服务器数据库中有一个表,在同步时跟踪任何ADDS。因此,重要的是,有一列的表受到影响,HandheldRowID
和相应的ServerRowID
-所以我会分别连接到它们,以防它们不正确匹配
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
现在,您和我都知道两台设备上A
表中的记录1502
不是同一条记录那么我们该怎么告诉服务器呢?
好吧,服务器应该简单地接收设备history
表,然后枚举其中的每个操作。在Add
上,它应该创建自己的自动递增的Id
值(在这种情况下是1503
(。然后,它将使用新的Id
将该记录添加到它的history
表中。一旦完成,它将从客户端设备请求该记录的实际数据,并将其保存到表中。
然后,服务器会看到相同Id
的Edit
记录,并将其处理掉
然后,服务器将看到Remove
记录,并从它自己的数据库中删除该Id
。然后,它将把它这样做的记录添加到history
表中。
一旦完成了所有这些(并将记录添加到服务器上的history
表中(,它将向手持设备发送其history
表的副本,然后手持设备将应用相同的更改。注意:手持设备应将其所做的更改回滚到力所能及的范围内。(如果存在Add 1502
,则为Remove 1502
。(然后它将接收服务器的更改副本。一旦这样做,它将做与服务器相同的事情,只是它不必担心Id
列上的自动递增,因为服务器处理了这一点。
当然,这个过程可以扩展(尽管更复杂(到拥有多个手持设备。
使用GUID/UniqueIdentifiers
如果您可以使用GUID
或uniqueidentifier
进行PK,则此过程非常简单。只需合并更改即可。任何CCD_ 29值重叠的机会都是最小到零。
我最喜欢的一句话(来自维基百科文章(:
它们可以由随机数(或伪随机数(生成,也可以不由随机数生成。由随机数生成的GUID通常包含6个固定比特(这些比特指示GUID是随机的(和122个随机比特;唯一这样的GUID的总数是2122(大约5.3×1036(。这个数字太大了,随机生成两次相同数字的概率可以忽略不计;然而,其他GUID版本具有不同的唯一性属性和概率,从保证的唯一性到可能的重复。为了简单起见,假设概率一致,如果截至2014年,地球上每个人都拥有6亿个GUID,那么一个重复的概率约为50%。
GUID引用:
生成算法的堆栈溢出问题
维基百科文章与一些好的统计