生成必须遵循某些规则的唯一数字的最佳方法是什么?

Dan*_*ski 0 language-agnostic

一些背景:在德国(至少)发票号码必须遵循一定的规则:

  1. 必须订购
  2. 它们必须是连续的(可能没有间隙)

几个月后,他们被允许包含字符.有些客户希望使用这种可能性,客户不知道或害怕,他们坚持使用仅限数字的发票号码.

此外,客户不希望在零处启动它们.

我能想出很多方法来产生这样一个数字吗?我想知道:最好的方法是什么?

Fro*_*rud 5

为了避免从0开始 - 只需从10000开始.忘记零填充.

您必须考虑何时分配号码.

如果您在首次打开发票进行编辑时分配号码,例如分配号码10014,并且用户取消发票,那么您就有差距,因为您必须记住其他人可能已经开始创建ID为10015的发票,因此您不能只回滚该号码.

如果您在完全写入发票并保存发票后分配号码,那么您将避免该方案,并且您将避免出现间隙,但在保存发票之前您将无法知道发票将具有哪个发票号码.

此外,您需要确保它是线程安全的,以便两个用户无法创建相同的发票号.

static object _invoiceNumberLock = new object();
public static string GetInvoiceNumber()
{
    lock(_invoiceNumberLock)
    {
        //Connect to database and get MAX(invoicenumber)+1
        //Increase the invoicenumber in SQL database by one
        //Perhaps also add characters
    }
}
Run Code Online (Sandbox Code Playgroud)

还要考虑通过在SQL数据库中的invoicenumber列上使用UNIQUE INDEX来备份唯一性.