Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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# 在SQL Server中读取并递增int值_C#_Sql Server 2008 - Fatal编程技术网

C# 在SQL Server中读取并递增int值

C# 在SQL Server中读取并递增int值,c#,sql-server-2008,C#,Sql Server 2008,我需要在SQLServer2008中使用c#以原子方式读取并增加一个值 例如,我必须插入“批次”的项目,为此我需要最后批次的编号,并确保没有其他人获得此编号 因此,我有一个表,只有最后的批号,并找到一种方法,以获得和更新的数字,只有一个步骤 如何实现这一点?最简单的方法是更改表格,使批号成为一个标识字段,并自动递增。那么您就不必担心代码的递增。批号必须按顺序排列吗?为什么不直接使用标识?这在并发性方面更好,否则您需要阻止并发插入尝试,以防它们回滚并在序列中留下间隙 如果这绝对是一项要求,那么你可

我需要在SQLServer2008中使用c#以原子方式读取并增加一个值

例如,我必须插入“批次”的项目,为此我需要最后批次的编号,并确保没有其他人获得此编号

因此,我有一个表,只有最后的批号,并找到一种方法,以获得和更新的数字,只有一个步骤


如何实现这一点?

最简单的方法是更改表格,使批号成为一个
标识
字段,并自动递增。那么您就不必担心代码的递增。

批号必须按顺序排列吗?为什么不直接使用
标识
?这在并发性方面更好,否则您需要阻止并发插入尝试,以防它们回滚并在序列中留下间隙

如果这绝对是一项要求,那么你可以这样做

CREATE TABLE dbo.Sequence 
  (
     OneRow CHAR(1) DEFAULT('X') PRIMARY KEY CHECK(OneRow = 'X'),
     val    INT
  )  
插入带有初始种子的行

INSERT INTO dbo.Sequence 
            (val)
VALUES     (1)  
然后为插入分配一个足够大的范围(显然在同一事务中调用它)


批号必须是连续的吗?为什么不使用
标识
?这里或这里的古怪更新方法可能会有所帮助。请注意这种“古怪更新”语法。我在上面第一个链接问题中的评论会引出更多信息……记录在哪里?持续到什么版本?我并不是说这是一个糟糕的解决方案,它只是没有通过我未来的校对测试。@Aaron
@variable=column=expression
在中特别允许,在注释中它说SET@variable=column=expression将变量设置为与列相同的值。这与SET@variable=column,column=expression不同,后者将变量设置为列的更新前值。我想知道最近几年是否添加了该注释。虽然我承认我已经很久没有看过这些文档了,但我知道这是一件很长一段时间都不能做的事情。重要的是要注意,如果您尝试对多行执行此操作,问题仍然会发生…@Aaron-Yep同意使用运行总计有很多问题。我在表定义中添加了一个检查约束,以确保它不能包含多行。
CREATE PROC dbo.GetSequence
@val AS int OUTPUT,
@n as int =1
AS
UPDATE dbo.Sequence 
SET @val = val = (val + @n);