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-所以我会分别连接到它们,以防它们不正确匹配

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

IF如果您不能更改PK字段类型(如我的评论所示,我建议您使用uniqueidentifier列(,那么您(一如既往(有几个选项。我要先突出我最喜欢的。

为了保持引用的完整性以及自动递增的Id字段,您应该将statehistory表一起保存。然后,当工作完成时,在两个数据库之间开始合并。手持设备应将其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表中。一旦完成,它将从客户端设备请求该记录的实际数据,并将其保存到表中。

然后,服务器会看到相同IdEdit记录,并将其处理掉

然后,服务器将看到Remove记录,并从它自己的数据库中删除该Id。然后,它将把它这样做的记录添加到history表中。

一旦完成了所有这些(并将记录添加到服务器上的history表中(,它将向手持设备发送其history表的副本,然后手持设备将应用相同的更改。注意:手持设备应将其所做的更改回滚到力所能及的范围内。(如果存在Add 1502,则为Remove 1502。(然后它将接收服务器的更改副本。一旦这样做,它将做与服务器相同的事情,只是它不必担心Id列上的自动递增,因为服务器处理了这一点。

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

使用GUID/UniqueIdentifiers

如果您可以使用GUIDuniqueidentifier进行PK,则此过程非常简单。只需合并更改即可。任何CCD_ 29值重叠的机会都是最小到零。

我最喜欢的一句话(来自维基百科文章(:

它们可以由随机数(或伪随机数(生成,也可以不由随机数生成。由随机数生成的GUID通常包含6个固定比特(这些比特指示GUID是随机的(和122个随机比特;唯一这样的GUID的总数是2122(大约5.3×1036(。这个数字太大了,随机生成两次相同数字的概率可以忽略不计;然而,其他GUID版本具有不同的唯一性属性和概率,从保证的唯一性到可能的重复。为了简单起见,假设概率一致,如果截至2014年,地球上每个人都拥有6亿个GUID,那么一个重复的概率约为50%。

GUID引用:

生成算法的堆栈溢出问题

维基百科文章与一些好的统计