c# - 在多用户 Web 环境中生成顺序发票编号

标签 c# asp.net sql-server entity-framework

我尝试使用 Web 表单创建和打印发票。我正在尝试找到我应该使用的最佳推荐做法。 到目前为止,我的做法是;

  1. 创建一个表来存储“下一个发票编号”,然后使用存储过程生成下一个编号,例如“下一个编号”+ 1。

  2. 将之前的数字存储在发票数据库表中,然后在我的 C# 代码中将其递增 1。

我想避免的是使用 SQL Server 身份(自动递增)来生成发票号,因为可能会出现差距(我在现实生活中看到过),但也有文章提到这些差距。 Why are there gaps in my IDENTITY column values? Identity increment is jumping in SQL Server database

我的问题是我应该遵循什么推荐做法来确保每张发票都获得连续的唯一发票编号?

最佳答案

我会推荐方法“a)”。

它有两种变体:

  1. 使用SEQUENCE .确保指定了 NO CACHE 选项。
  2. 如您所述,创建一个“计数器”表,用于存储下一个要分配的 ID。

它的代码看起来像这样:

CREATE TABLE Counter( NextID INT NOT NULL DEFAULT(1))
INSERT INTO Counter VALUES( DEFAULT )

DECLARE @NextID INT
UPDATE Counter
SET @NextID = NextID,
    NextID = NextID + 1

SELECT @NextID

注意:我不完全理解您对选项“b)”的描述。假设您的意思是:您想要搜索当前发票表以查找 MAX 现有发票,然后向其中添加一个,那么我强烈建议不要使用这种方法,因为它很脆弱。如果您没有为搜索查询创建覆盖索引,那么您可能会因竞争条件而出现问题。

关于c# - 在多用户 Web 环境中生成顺序发票编号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47197258/

相关文章:

asp.net - 如何防止文字导致其容器增长?

ASP.Net 自定义 session 状态管理

sql-server - 如何修复 SQL Server 数据库中的恢复挂起状态?

c# - 区分两个表的最快方法,一个在 sql 中,一个在 access 中

c# - 如果在 "Tab"之后按 "else",VS 会自动添加括号。在任何代码块打开器之后,我怎样才能做到这一点?

c# - 制作一些 OnIdiom 和 OnPlatform StaticResource

c# - 无法选择已禁用或无法选择的菜单项

sql-server - 如何删除 SQL Server Management Studio "Connect to Server"屏幕中的服务器条目?

c# - 枚举描述到字符串

c# - 在 ASP.NET 回发期间如何安全地保留密码字段的值?