如何在sql中获取下一个auto_increment值

时间:2012-07-13 10:53:31

标签: c# sql sql-server winforms sql-server-2000

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

我有一个表employee_master,其中包含Id, name, addressphone no等列。 Id是自动增量,所有其他数据类型都是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();

我在textBox上显示。

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

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

10 个答案:

答案 0 :(得分:21)

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

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

SELECT IDENT_CURRENT('table_name');

下一个自动递增值。

SELECT IDENT_CURRENT('table_name')+1; 

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

答案 1 :(得分:6)

试试这个:

SELECT IDENT_CURRENT('tbl_name') + IDENT_INCR('tbl_name');

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

max(id)将获得列表pf employee_master

中的最大数量

e.g。 id = 10,20,100所以max会得到100

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

所以你还得100回来

我说这个问题的一个重要原因可能是问题,因为您未在查询中使用按ID排序

答案 4 :(得分:0)

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

SELECT IDENT_CURRENT(<TableName>)

答案 5 :(得分:0)

select isnull((max(AddressID)+1),1) from AddressDetails

答案 6 :(得分: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>

答案 7 :(得分:0)

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

SELECT @@IDENTITY FROM...

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

答案 8 :(得分: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();
  }

答案 9 :(得分:0)

对我来说,最好的答案是:

dbcc checkident(table_name)

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