私はc#でwinformアプリケーションを作成し、sqlデータベースを使用しています。
employee_master
やId, 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に表示しています。
しかし、テーブルの最後の行が削除されても、テキストボックスで最近削除された値がまだ取得されます
次の自動インクリメント値を取得するにはどうすればよいですか?
SQLServerから次の自動インクリメント値を取得するには:
これにより、現在の自動インクリメント値が取得されます。
SELECT IDENT_CURRENT('table_name');
次の自動増分値。
SELECT IDENT_CURRENT('table_name')+1;
------>これは、行を追加してから削除した場合でも機能します。IDENT_CURRENTは、任意のセッションとスコープで特定のテーブルに対して生成された最後のID値を返すためです。
これを試して:
SELECT IDENT_CURRENT('tbl_name') + IDENT_INCR('tbl_name');
Microsoft SQL Serverを使用している場合。このステートメントを使用して、テーブルの現在のID値を取得します。次に、次のIDを取得する場合は、テーブルの設計時に指定したシード値を追加します。
SELECT IDENT_CURRENT(<TableName>)
テーブルから行を削除すると、次の数値は減少しませんので同じままです。
したがって、100行あり、100行を削除した場合、99行ありますが、次の数値は101になります。
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();
}
考えてみれば、すでに開いている接続に挿入した最後の自動番号が必要な場合は、次を使用してみてください。
SELECT @@IDENTITY FROM...
その接続から。これは、特定の接続で発生したことを追跡し、他の接続との競合状態を回避するための最良の方法です。最大のアイデンティティを取得することは、一般的に実現可能ではありません。
max(id)は、リストpf employee_masterの最大数を取得します
例えばid = 10、20、100なので、最大で100になります
しかし、レコードを削除するとき、それは100ではなかったに違いありません
だからあなたはまだ100を取り戻す
クエリでIDによる注文を使用していないため、これが問題である可能性があると私が言う重要な理由の1つ
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>
select isnull((max(AddressID)+1),1) from AddressDetails