web-dev-qa-db-ja.com

SQLで次のauto_increment値を取得する方法

私はc#でwinformアプリケーションを作成し、sqlデータベースを使用しています。

employee_masterId, name, addressのような列を持つphone 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に表示しています。

しかし、テーブルの最後の行が削除されても、テキストボックスで最近削除された値がまだ取得されます

次の自動インクリメント値を取得するにはどうすればよいですか?

13
siddharth

SQLServerから次の自動インクリメント値を取得するには:

これにより、現在の自動インクリメント値が取得されます。

SELECT IDENT_CURRENT('table_name');

次の自動増分値。

SELECT IDENT_CURRENT('table_name')+1; 

------>これは、行を追加してから削除した場合でも機能します。IDENT_CURRENTは、任意のセッションとスコープで特定のテーブルに対して生成された最後のID値を返すためです。

23
patel.milanb

これを試して:

SELECT IDENT_CURRENT('tbl_name') + IDENT_INCR('tbl_name');
6
Mehdi Esmaeili

Microsoft SQL Serverを使用している場合。このステートメントを使用して、テーブルの現在のID値を取得します。次に、次のIDを取得する場合は、テーブルの設計時に指定したシード値を追加します。

SELECT IDENT_CURRENT(<TableName>)
1
Rumit Parakhiya

テーブルから行を削除すると、次の数値は減少しませんので同じままです。

したがって、100行あり、100行を削除した場合、99行ありますが、次の数値は101になります。

1
Gaz Winter
 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();
  }
0
manish madankar

考えてみれば、すでに開いている接続に挿入した最後の自動番号が必要な場合は、次を使用してみてください。

SELECT @@IDENTITY FROM...

その接続から。これは、特定の接続で発生したことを追跡し、他の接続との競合状態を回避するための最良の方法です。最大のアイデンティティを取得することは、一般的に実現可能ではありません。

0
Beastian

max(id)は、リストpf employee_masterの最大数を取得します

例えばid = 10、20、100なので、最大で100になります

しかし、レコードを削除するとき、それは100ではなかったに違いありません

だからあなたはまだ100を取り戻す

クエリでIDによる注文を使用していないため、これが問題である可能性があると私が言う重要な理由の1つ

0
HatSoft

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>
0
Martini
select isnull((max(AddressID)+1),1) from AddressDetails
0
Jidheesh Rajan