Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在脱机模式下提供唯一ID?_C#_Sql - Fatal编程技术网

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

C# 如何在脱机模式下提供唯一ID?,c#,sql,C#,Sql,在发票形式的客户机-服务器会计应用程序中,当用户保存发票时,它会从服务器获取一个发票号,如90134,并使用该编号保存发票客户需要发票号。 那么在离线模式下(比如网络断开时),如何提供唯一的id 像这样使用字符串Id好吗:客户机+增量数字 我不想使用GUIDs.您可以使用GUID: var myUniqueID = Guid.NewID(); 在SQL server中,是相应的类型唯一标识符 一般来说,Guid是128位数字 有关Guid的详细信息,请阅读: 我假设发票号(整数)是递增的:在

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

像这样使用字符串Id好吗:客户机+增量数字

我不想使用
GUID
s.

您可以使用GUID:

var myUniqueID = Guid.NewID();
在SQL server中,是相应的类型
唯一标识符

一般来说,Guid是128位数字

有关Guid的详细信息,请阅读:


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

如果您事先知道在脱机期间每个客户端将生成多少发票号,您是否能够预分配发票号?e、 g.如果每个客户可能在每个脱机期间仅生成4张发票,则您可以为每个客户分配一个包含4个数字的区块。这可能涉及数据库中的一个额外列来存储一个值,该值指示该编号是已创建的发票,还是编号的预分配。根据数据库中的结构和约束,您可能还需要存储一些虚拟数据来强制引用完整性


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

您可以在不同的范围内为每个客户启动号码。。。e、 g:

  • 客户1:1000000
  • 客户2:2000000
  • 客户3:300万
当有连接时,不时更新它们以避免重叠。
它不是100%防弹的,但至少总比没有好


对于这一点,我最喜欢的还是
GUID
,因为它们总是唯一的。

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

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

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

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

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

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

2-在SQL server上生成其唯一ID

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

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


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

在两个不同的系统都处于脱机状态的情况下,似乎不可能创建唯一的数字,而这两个系统必须按时间顺序排列,并且没有丢失的数字

如果服务器上的最后一个数字是10,我无法知道我应该返回11还是12;我必须知道11是否已经被其他人使用


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

正如我提到的,ID的格式是带有4位或更多数字的号码抱歉,但带有4位数字的唯一标识设计不好。如果您希望不同的人/计算机使用不同的号码-您可以分配一些前缀/后缀,然后再增加一些本地保存的号码。发票号码是客户未来操作所需的“发票号码是客户未来操作所需的”-如果系统处于脱机状态,那么理论上它可能永远不会返回联机状态,因此提供客户依赖的临时号码将是不好的做法。在本地存储并仅在系统中实际有号码时提供号码是确保客户拥有正确发票号码以供将来参考的唯一方法。有一个解决办法,但这只是一个“肮脏的黑客”,您应该认真重新考虑在脱机时接受新的数据输入,特别是在处理要插入到许多表中的唯一ID时。我想您有多个客户端?要在脱机模式下提供唯一ID,您已经有了答案(Guid、前缀、范围等)。如果您的问题是关于发票号,您必须检查法律:范围、前缀或guid可能不允许阻止您脱机创建发票。“patter client”是什么意思?在我国,发票号必须按时间顺序排列,并且不能有未使用的发票号。@Guillaume在这种情况下,我认为您将很难通过脱机模式找到一个可接受的解决方案。也许是时候重新考虑解决方案了——是否有理由支持离线模式,而不是在网络再次可用时重试?这不是我的问题,我试图提出一个潜在的法律问题。