显示下一条记录的 ID
本文关键字:ID 记录 一条 显示 | 更新日期: 2023-09-27 18:31:43
我正在创建发票,我希望其中有一个文本框来显示我要插入的记录的 id,我听说过 SCOPE_IDENTITY,@@IDENTITY 和IDENT_CURRENT但它们似乎都显示插入的最后一条记录的 id,而不是新记录的 id。
我找到了这篇文章,但我最终收到一个错误(https://www.bram.us/2008/07/30/mysql-get-next-auto_increment-value-from-table/),这是我现在使用的代码,它给出了错误:
try
{
SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)'v11.0;AttachDbFilename='C:'Users'Admin'supermarket1.mdf';Integrated Security=True;Connect Timeout=30;");
SqlCommand invoiceno = new SqlCommand("SELECT InvoiceNo FROM Invoice", con);
con.Open();
SqlDataReader ie = invoiceno.ExecuteReader();
while (ie.Read())
{
txtInvoice.Text = (ie[0].ToString());
}
con.Close();
}
catch (Exception ex)
{
MessageBox.Show("Error " + ex);
}
请求新的发票页面时,立即在发票表中插入新的空白记录,并使用Scope_Identity()
获取新发票的 ID。
然后,您可以在页面上显示新发票的 ID,并使用用户输入的信息UPDATE
该发票。
您看到的是当前记录的 ID,因为这是您向数据库请求的内容。
SELECT InvoiceNo FROM Invoice
是请求所有现有发票的查询。然后,您将循环访问每个发票编号并更新txtInvoice.Text
,直到到达创建的最后一个发票。
可能有一个解决方案,但我觉得这不是一个好主意,你不能可靠地得到Next InvoiceNo
.
如果 2 个用户同时使用此软件会怎样?他们都看到了相同的Next InvoiceNo
,一个人去保存时实际上最终会得到不同的InvoiceNo
。
或者,您可以通过创建空白行来保留InvoiceNo
,但是如果有人决定不保存数据会发生什么?您需要正确处理这些空白记录,例如,如果有人取消订单,您如何确保记录被处置?如果您有某种报告,现在您的查询需要排除空白记录怎么办。这是额外的开销。
可能值得重新审视该要求,发票在创建之前是否真的需要InvoiceNo
?
我认为你无法得到它,如果可以通过我不知道的 SQL 方法,我不能特别信任这个 ID 在多实例应用程序中,例如 Web 应用程序或移动应用程序,例如,您获得 ID 的那一刻可能是插入的另一条记录,您获得的这个 ID 号不再是下一个值。
因此,如果这是必须的要求,我建议在数据库中禁用自动身份增量并使其由您的应用程序管理,例如您将可以更好地控制身份,并且可以轻松准确地知道当前和下一个。
如果这是单个实例应用,则只需将 1 添加到当前记录标识。
我发现有人在SO Query上问了同样的事情来获取下一个身份?
创建发票之前需要发票的 ID?我想不出一个严肃的原因。
Tab Alleman提出的解决方案将起作用,但它可能会导致问题:如果用户改变主意并取消操作怎么办?当然,您可以删除临时记录,但id
已被使用。那么问题出在哪里呢?在我国,有一项法律要求规定,应为文件分配连续的注册号(...),因此不允许有间隙。此外,注册号必须印在文件上。只需分多个步骤完成工作:
- 在数据库中插入记录
- 查询新创建的记录的 ID
- 使用获取的 ID 打印发票