如何在离线模式下提供唯一ID?

问题描述

| 在发票形式的客户-服务器会计应用程序中,当用户保存一个发票时,它将从服务器获得一个发票号,例如90134,并用该编号保存发票。客户需要发票号。 那么在离线模式下(例如当网络断开时)如何提供唯一的ID? 像这样的模式使用String Id很好吗:客户端+增量号? 我不想使用ѭ0。     

解决方法

        如果您预先知道在离线期间每个客户将生成多少个发票号,您是否可以预先分配发票号?例如如果每个客户每个脱机期间可能仅生成4张发票,则可以为每个客户分配4个号码的块。这可能会在数据库中包含一个额外的列,用于存储一个值,该值指示该数字是已创建的发票还是数字的预分配。根据数据库中的结构和约束,您可能还需要存储一些虚拟数据以增强参照完整性。 不利之处在于您的号码块可能无法顺序使用,甚至根本无法使用,因此您的发票号码不会按时间顺序排列。另外,如果可用号码池用完了,您也会遇到问题。     ,        您可以使用Guid:
var myUniqueID = Guid.NewID();
在SQL Server中是对应的类型“ 2”。 通常,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:1,000,000 客户2:2,000 客户3:3,000 有连接时请不时更新它们,以避免重叠。 它不是100%防弹的,但至少总比没有好。 我最喜欢的仍然是
GUID
,因为它们始终是唯一的。     ,        有一种解决方法,但这仅仅是一个“肮脏的黑客”,您应该认真考虑重新离线时接受新数据条目,尤其是在处理要插入许多表中的唯一ID时。 假设您的本地数据集中有一个\“ orders \”表和另一个\“ orderDetails \”表: 1-在您的“订单”表中添加一个整数类型的tmpID,以临时标识每个唯一订单。 2-在其余过程中使用新创建的订单的tmpID(例如,在orderDetails表中将产品添加到当前订单中) ->连接到服务器后,在单个事务中执行以下操作 1-在“订单”表中插入第一个订单 2-获取在您的SQL Server上生成的uniqueID 3-搜索\“ orderDetails \”中tmpID为currentOrder.tmpID的每一行,并将其插入服务器上的\“ orderDetails \”表中 4-提交事务并继续到下一行。 请记住,这是非常糟糕的编码,并且可能会变得很脏且难以维护。     ,        在必须按时间顺序且不丢失数字的情况下,用两个不同的系统离线创建唯一的数字似乎是不可能的。 恕我直言,如果(服务器上的)最后一个数字是10,我将无法返回11或12。我将不得不知道11是否已被另一个人使用。 我只能想象使用一个临时编号,然后再对这些编号重新编号,但是如果打印了发票并且无法更改编号,我不知道您如何完成这样的解决方案。