Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 Server - Fatal编程技术网

C# 为不同实体生成序列

C# 为不同实体生成序列,c#,sql-server,C#,Sql Server,在我们的应用程序中,我们有不同的项目类型,例如A、B、C、D 用户可以为每种类型创建一个项目,每个项目都必须有自己的序列号 A-1 // the next item will have number as 2 B-2 // the next item will have number as 3 C-1 D-1 解决方案-1 我可以创建一个单独的表,存储每个itemtype的序列号 从该表中获取最新值,使用它,将其递增1,然后更新该表 如果我们不在代码中实现任何锁定机制,这个解决方案可能会导致

在我们的应用程序中,我们有不同的项目类型,例如A、B、C、D

用户可以为每种类型创建一个项目,每个项目都必须有自己的序列号

A-1 // the next item will have number as 2
B-2 // the next item will have number as 3
C-1
D-1
解决方案-1

  • 我可以创建一个单独的表,存储每个itemtype的序列号
  • 从该表中获取最新值,使用它,将其递增1,然后更新该表
  • 如果我们不在代码中实现任何锁定机制,这个解决方案可能会导致两个项目具有相同的编号
解决方案-2

  • 对于每种项目类型,我们在DB中定义一个序列
  • 使用的下一个值获取下一个序列号

  • 在这种方法中,我们不必在代码中执行任何锁定机制


请建议应该采取什么方法,或者有没有更好的方法来实现它。

如果您的项目类型没有扩展,那么我会选择解决方案2,但如果您希望它增长,那么请使用创建触发器增强解决方案1。。。对于INSERT,我也遇到了同样的问题,我从解决方案1开始,但最终还是使用了解决方案2,以避免由防止重复所需的锁引起的死锁

您可以定义一个简单的存储过程来管理自定义序列。它将在必要时创建一个新序列,并返回对应序列的下一个值

CREATE PROCEDURE [dbo].[CUSTOM_SEQUENCES_NewValue]
    @TYPE nvarchar(32), 
    @VALUE int out
AS
  declare @SEQUENCE nvarchar(64); 
  declare @SQL nvarchar(128);
BEGIN
  set @SEQUENCE = N'SEQ_CUSTOM_SEQUENCE_' + @TYPE

  if not exists(select * from sys.sequences where name = @SEQUENCE) 
  begin
    set @SQL = N'create sequence dbo.' + @SEQUENCE + ' as bigint start with 1';
    execute sp_executesql @SQL;
  end

  set @SQL = N'set @VALUE = next value for dbo.' + @SEQUENCE;
  exec sp_executesql @SQL, N'@VALUE int out', @VALUE = @VALUE out;
END

你已经回答了。您有不同的项目类型,因此每个A、B、C和D都有不同的表。然后每个项目都有自己的ID,在本例中为int,您可以得到您想要的。

您能容忍数字上的差距吗?我的意思是,如果你有
A-1
A-3
但没有
A-2
,那对你来说是“交易破坏者”,还是只要你有升序的数字就可以了?我现在还不打算重复你的问题,但我想我们怎么知道这些数字对你意味着什么?我们不知道你在想什么“独一无二!,只是数字还是数字加上它的类型?两者都是可能和有效的。适合你的场景只有你自己知道。这就是为什么我投票以opinion.based结束这个问题。你们能不能不使用SQL表来处理ID生成?这看起来简单多了……这实际上是一个很好的解决方案。但是,请注意,如果同一类型的数字之间的潜在差距是一个问题,那么我建议的解决方案(在答案注释的链接中)仍然比这个更好。另外,通常生成数据库对象应该是设计时操作,而不是运行时操作。尽管如此,我认为这个答案仍然值得一个+1。