我正在创建发票,我想在其中显示一个文本框,以显示我要插入的记录的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);
}
答案 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
已被使用。那么问题是什么?在我的国家/地区,法律要求规定应为文档(...)分配连续注册号,因此不允许存在间隙。注册号必须打印在文档上。
只需多个步骤完成工作: