显示下一条记录的ID

时间:2016-01-25 14:09:15

标签: c# sql-server

我正在创建发票,我想在其中显示一个文本框,以显示我要插入的记录的ID,我听说过SCOPE_IDENTITY,@@ IDENTITY和IDENT_CURRENT,但它们似乎都显示了id插入的最后一条记录,而不是新记录的ID。

我发现了这篇文章,但最终收到错误(https://www.bram.us/2008/07/30/mysql-get-next-auto_increment-value-fromfor-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);
}

4 个答案:

答案 0 :(得分:1)

请求新发票页面后,立即在发票表中插入新的空白记录,并使用Scope_Identity()获取新发票的ID。

然后,您可以在页面上显示新发票的ID,并UPDATE该发票包含用户输入的信息。

答案 1 :(得分:0)

我认为你不能得到它,如果有可能通过我不知道的SQL方法,我不能相信这个ID特别是在多实例应用程序中,例如Web应用程序或移动应用程序,至于例如,您获得ID的那一刻可能是插入了另一条记录,并且您获得的此ID号不是下一个值。

因此,如果这是必须要求,我建议在数据库中禁用自动身份增量,并使其由您的应用程序管理,就像您将对身份有更多控制权,并且可以轻松地确切知道当前和下一个。

如果这是一个单实例应用程序,您只需将1添加到当前记录标识。

我发现有人在SO Query to get the next identity?

上问了同样的问题

答案 2 :(得分:0)

您正在查看当前记录的ID,因为这就是您要求数据库提供的内容。

SELECT InvoiceNo FROM Invoice是一个请求所有现有发票的查询。然后,您将迭代每个发票号并更新txtInvoice.Text,直到您到达最后创建的发票。

可能有一个解决方案,但我觉得这不是一个好主意,你无法可靠地获得Next InvoiceNo

如果2位用户同时使用此软件会怎样?他们都看到相同的Next InvoiceNo,当他们去保存时,一个人实际上最终会获得不同的InvoiceNo

或者,您可以通过创建空白行来保留InvoiceNo但是如果有人决定不保存数据会发生什么?您需要正确处理这些空白记录,例如,如果有人取消订单,您如何确保记录被处理?如果您有某种报告,那么现在您的查询需要排除空白记录。这是额外的开销。

可能值得重新审视一下这个要求,发票在创建之前确实需要InvoiceNo吗?

答案 3 :(得分:0)

为什么在创建之前需要发票的ID?我无法想到一个严肃的理由。

Tab Alleman提出的解决方案可行,但可能会导致问题:如果用户改变主意并取消操作会怎么样?当然,您可以删除临时记录,但id已被使用。那么问题是什么?在我的国家/地区,法律要求规定应为文档(...)分配连续注册号,因此不允许存在间隙。注册号必须打印在文档上。 只需多个步骤完成工作:

  • 在数据库中插入记录
  • 查询新创建的记录的ID
  • 使用获取的ID打印发票