一些背景:在德国(至少)发票号码必须遵循一定的规则:
必须订购
它们必须是连续的(可能没有间隙)
几个月后,他们被允许包含字符.有些客户希望使用这种可能性,客户不知道或害怕,他们坚持使用仅限数字的发票号码.
此外,客户不希望在零处启动它们.
我能想出很多方法来产生这样一个数字吗?我想知道:最好的方法是什么?
为了避免从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 } }
还要考虑通过在SQL数据库中的invoicenumber列上使用UNIQUE INDEX来备份唯一性.