19

我正在用 c#.and 使用 sql 数据库创建一个 winform 应用程序。

我有一张桌子,employee_master其中有 和 之类的Id, name, addressphone noId是自动增量,所有其他数据类型都是varchar.

我正在使用此代码来获取下一个自动增量值:

string s = "select max(id) as Id from Employee_Master";
SqlCommand cmd = new SqlCommand(s, obj.con);
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
int i = Convert.ToInt16(dr["Id"].ToString());
txtId.Text = (i + 1).ToString();

我在文本框上显示。

但是当表中的最后一行被删除时,我仍然得到最近在文本框中删除的值

我应该如何获得下一个自动增量值?

4

10 回答 10

36

要从 SQLServer 获取下一个自动增量值:

这将获取当前的自动增量值。

SELECT IDENT_CURRENT('table_name');

下一个自增值。

SELECT IDENT_CURRENT('table_name')+1; 

------> 即使您添加一行然后删除它,这也将起作用,因为 IDENT_CURRENT 返回为任何会话和任何范围内的特定表生成的最后一个标识值。

于 2012-07-13T11:00:55.673 回答
11

试试这个:

SELECT IDENT_CURRENT('tbl_name') + IDENT_INCR('tbl_name');
于 2013-12-27T16:54:48.793 回答
2

如果您使用的是 Microsoft SQL Server。使用此语句获取表的当前标识值。然后添加您在设计表时指定的种子值,如果您想获得下一个 id。

SELECT IDENT_CURRENT(<TableName>)
于 2012-07-13T11:00:13.723 回答
2

至于我,最好的答案是:

dbcc checkident(table_name)

您将看到两个值(可能相同)当前标识值、当前列值

于 2020-09-17T09:05:28.780 回答
1

当您从表中删除一行时,下一个数字将保持不变,因为它不会以任何方式减少。

因此,如果您有 100 行并删除了第 100 行。您将有 99 行,但下一个数字仍将是 101。

于 2012-07-13T11:01:02.790 回答
1
select isnull((max(AddressID)+1),1) from AddressDetails
于 2013-10-09T06:30:35.233 回答
0

max(id) 将为您提供列表 pf employee_master 中的最大数量

例如 id = 10, 20, 100 所以 max 会给你 100

但是当你删除记录时它一定不是 100

所以你仍然可以得到 100 回

我说这可能是问题的一个重要原因,因为您没有在查询中使用 order by id

于 2012-07-13T10:57:43.373 回答
0

对于 MS SQL 2005 及更高版本:

Select Cast(IsNULL(last_value,seed_value) As Int) + Cast(increment_value As Int) As NextID
From sys.identity_columns
WHERE NAME = <Table_Name>
于 2014-04-18T19:32:16.673 回答
0

只是一个想法,如果您想要的是您在已打开的连接上插入的最后一个自动编号,请尝试使用:

SELECT @@IDENTITY FROM...

从那个连接。这是跟踪给定连接上刚刚发生的事情并避免与其他连接竞争的最佳方式。获得最大身份通常是不可行的。

于 2016-06-07T15:03:08.533 回答
0
 SqlConnection con = new SqlConnection("Data Source=.\SQLEXPRESS;Initial Catalog=databasename;User ID=sa;Password=123");
 con.Open();
 SqlCommand cmd = new SqlCommand("SELECT TOP(1) UID FROM InvoiceDetails ORDER BY 1 DESC", con);

 SqlDataReader reader = cmd.ExecuteReader();

 //won't need a while since it will only retrieve one row
 while (reader.Read())
 {
     string data = reader["UID"].ToString();
     //txtuniqueno.Text = data;
     //here is your data
     //cal();
     //txtuniqueno.Text = data.ToString();
     int i = Int32.Parse(data);
     i++;
     txtuid.Text = i.ToString();
  }
于 2019-06-20T04:52:20.573 回答