Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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# 提供一系列唯一数字(C与Sql)的好方法是什么?_C#_Sql_Sql Server - Fatal编程技术网

C# 提供一系列唯一数字(C与Sql)的好方法是什么?

C# 提供一系列唯一数字(C与Sql)的好方法是什么?,c#,sql,sql-server,C#,Sql,Sql Server,我必须为我的应用程序的客户端提供一个唯一的号码。 这是一个发票号码,所以它必须是唯一的,并且是线程安全的 在过去,我创建了一个singleton并使用了lock语句:在锁期间,我会去数据库获取一个新的数字,然后释放锁 有些东西告诉我,这也可以在SqlServer中完成,但在SqlServer中,我假设我还必须创建某种锁,因为我猜sql代码存储过程也可以并行执行 因此,当我必须提供锁时,无论我是用c还是用Sql,都会有区别吗?如果你能处理它糟糕的外观,数据库的时间戳是线程安全的:SELECT@@d

我必须为我的应用程序的客户端提供一个唯一的号码。 这是一个发票号码,所以它必须是唯一的,并且是线程安全的

在过去,我创建了一个singleton并使用了lock语句:在锁期间,我会去数据库获取一个新的数字,然后释放锁

有些东西告诉我,这也可以在SqlServer中完成,但在SqlServer中,我假设我还必须创建某种锁,因为我猜sql代码存储过程也可以并行执行


因此,当我必须提供锁时,无论我是用c还是用Sql,都会有区别吗?

如果你能处理它糟糕的外观,数据库的时间戳是线程安全的:SELECT@@dbts


您可以修剪前导零,使其看起来更像一个可接受的发票id

我所知道的唯一能够可靠地独立生成唯一数字的解决方案是GUID数据类型。问题是,这太长了,不能轻易用作订单号

使用数据库从标识字段获取下一个数字意味着您不必管理锁,只需执行一次插入,DB就会提供下一个数字


当然,如果发票未保存,则该号码已被使用,现在已丢失。如果你不介意的话,我会用那种方法。在代码中这样做是一件痛苦的事情,另外,当应用程序的实例上运行了多个应用程序时会发生什么?您可以获得生成的相同编号。

在SQL Server中使用标识列:

-- Set up
create table UniqueNumberGenerator (UN int identity primary key)

-- Generate value
insert into UniqueNumberGenerator default values
select scope_identity()
这比在桌子上获得锁更快、更轻。请参阅以了解肮脏的详细信息


如果您担心表中充满了数千行,不用担心,您可以定期从表中删除所有行,SQL Server仍然会记住要生成的下一个值。如果需要,您可以使用dbcc checkident重置生成的值。

您可以使用C中的Guid或SQL中的uniqueidentifier吗?您可能对本文感兴趣:请,请明确:您是锁定数字以保持其唯一性,还是将数字锁定到缓冲区中并在不必要时释放回数字?我锁定了代码,以便一次只有一个请求可以获得新的数字。没有guid,除非您可以从中创建一个唯一的序列号,如1、2、3、4。目前为止,最好的方法是+1。KISS etcAs tony说:对于更多的实例,锁定代码是不够的,因此数据库是唯一的选择。我还将添加创建日期,以便我们还可以跟踪数字的创建时间。请务必阅读@@dbts上的文档,因为它本身不会生成新代码。必须在带有时间戳字段的表中插入一行@@dbts然后返回最近使用的值。你是对的。我使用的是一个生产数据库,在所有带有时间戳列的表中始终有大量插入。这个背景远远不是一个细节,当然,没有这样的背景,我的建议是完全不准确的。很抱歉