显示下一条记录的 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);
}

显示下一条记录的 ID

请求新的发票页面时,立即在发票表中插入新的空白记录,并使用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 打印发票