如何在脱机模式下提供唯一ID

本文关键字:唯一 ID 模式 脱机 | 更新日期: 2023-09-27 17:59:15

在发票形式的客户端-服务器会计应用程序中,当用户保存发票时,它会从服务器获得类似90134的发票编号,并使用该编号保存发票
客户需要发票编号
那么在脱机模式下(比如网络断开时)如何提供唯一的id?

像这样使用StringId模式好吗:客户端+增量数字?

我不想使用GUID s。

如何在脱机模式下提供唯一ID

如果您提前知道在离线期间每个客户将生成多少发票号,您是否能够预先分配发票号?例如,如果每个客户在离线期间可能只生成4张发票,则可以为每个客户分配一个由4个数字组成的块。这可能涉及数据库中的一个额外列,用于存储一个值,该值指示该号码是已经创建的发票,还是预先分配的号码。根据数据库中的结构和约束,您可能还需要存储一些伪数据来强制执行引用完整性。

不利的一面是,你的号码块可能没有按顺序使用,或者根本没有,所以你的发票号码不会按时间顺序排列。此外,如果可用号码池用完了,您也会遇到问题。

您可以使用Guid:

var myUniqueID = Guid.NewID();

在SQL server中是相应的类型uniqueidentifier

通常,Guid是128位数字。

有关Guid的更多信息,您可以阅读:

http://en.wikipedia.org/wiki/Globally_unique_identifier

http://msdn.microsoft.com/en-us/library/system.guid.aspx

我假设发票编号(整数)是递增的:在这种情况下,由于您无法知道最后一个发票编号,您可以将发票保存在没有发票编号的本地db/cache/xml中,并等待网络连接在数据库中插入新记录(然后会生成发票编号)

您可以在不同的范围内为每个客户端开始编号。。。例如:

  • 客户1:1000000
  • 客户2:2000000
  • 客户3:3000000

连接时,不时更新它们以避免重叠
它不是100%防弹的,但至少总比什么都没有好。

我最喜欢的仍然是GUID,因为它们总是独一无二的。

有一个解决方法,但这只是一个"肮脏的黑客",您应该认真考虑在脱机时接受新的数据条目,尤其是在处理要插入许多表中的唯一ID时。

假设您在本地数据集中有一个"订单"表和另一个"orderDetails"表:

1-在"订单"表中添加一个整数类型的tmpID,以临时标识每个唯一的订单。

2-在剩下的过程中使用新创建订单的tmpID(比如在orderDetails表中将产品添加到当前订单中)

-->连接到服务器后,在单个事务中执行以下

1-在"订单"表中插入第一个订单

2-在您的SQL服务器上生成其uniqueID

3-在"orderDetails"中搜索tmpID为currentOrder.tmpID的每一行,并将它们插入服务器上的"orderDetails"表中

4-提交事务并继续到下一行。

请记住,这是非常糟糕的编码,它可能会变得非常脏,很难维护。

在两个不同的系统离线的情况下创建唯一的数字似乎是不可能的,因为它必须是按时间顺序排列的,并且没有丢失的数字。

imho如果(服务器上的)最后一个数字是10,就不可能知道我应该返回11还是12;我必须知道11是否已经被其他人使用了。

我只能想象使用一个临时编号,然后重新编号,但如果发票是打印出来的,并且编号不能更改,我不知道你如何才能实现这样的解决方案。