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

时间:2011-06-15 08:56:22

标签: c# sql

在发票形式的客户 - 服务器会计应用程序中,当用户保存一个invoce时,它从服务器获得一个发票号码,如90134,并保存带有该号码的发票。客户需要发票号码。 /> 那么在离线模式下(比如当网络掉线时)如何提供唯一的ID?

使用String Id就像这种模式一样好:客户端+增量号码?

我不想使用GUID s。

6 个答案:

答案 0 :(得分:3)

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

缺点是您的数字块可能无法按顺序使用,或者根本不会使用,因此您的发票编号不会按时间顺序排列。此外,如果可用数字池用完,您将遇到问题。

答案 1 :(得分:2)

你可以使用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

答案 2 :(得分:2)

我认为发票号(整数)是增量的:在这种情况下,由于您无法知道最后一个发票号,您可以将发票保存在本地db / cache / xml中,而不包含发票号并等待用于在DB中插入新记录的网络连接(然后将生成发票号)

答案 3 :(得分:1)

您可以为不同范围的每个客户开始您的号码......例如:

  • 客户1:1,000,000
  • 客户2:2,000,000
  • 客户3:3,000,000

连接以避免重叠时,立即更新它们 它不是100%防弹,但至少它比没有好。

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

答案 4 :(得分:0)

有一种解决方法,但它只是一种“肮脏的黑客”,你应该认真考虑在离线时接受新数据条目,特别是在处理要插入许多表中的唯一ID时。

假设您的本地数据集中有“orders”表和另一个“orderDetails”表:

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

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

- >一旦连接到服务器,在单个事务中执行以下操作

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

2-获取在SQL服务器上生成的uniqueID

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

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

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

答案 5 :(得分:0)

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

如果最后一个号码(在服务器上)是10,则无法知道我是否应该返回11或12;我不得不知道11是否已被另一个人使用过。

我只能想象使用临时号码然后重新编号这些号码,但如果打印发票且号码无法更改,我不知道如何完成这样的解决方案。