19

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

employee_masterとのような列を持つ 1 つのテーブルがId, name, addressありますphone 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 は、任意のセッションおよび任意のスコープで特定のテーブルに対して生成された最後の ID 値を返すため、行を追加してから削除しても、これは機能します。

于 2012-07-13T11:00:55.673 に答える
2

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

SELECT IDENT_CURRENT(<TableName>)
于 2012-07-13T11:00:13.723 に答える
1

テーブルから行を削除すると、次の番号は減りません。

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

于 2012-07-13T11:01:02.790 に答える
0

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

SELECT @@IDENTITY FROM...

そのつながりから。これは、特定の接続で何が起こったかを追跡し、他の接続との競合状態を回避するための最良の方法です。最大の ID を取得することは、一般的に実行可能ではありません。

于 2016-06-07T15:03:08.533 に答える
0

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

例: id = 10, 20, 100 なので、最大は 100 になります

しかし、レコードを削除すると、100 ではなかったはずです

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

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

于 2012-07-13T10:57:43.373 に答える