如何在datagridview中处理标识列?

时间:2013-09-28 20:05:42

标签: c# .net sql database ado.net

我在数据库中创建了一个名为id的标识列的表。当我从这个表中删除数据并添加新数据时,id列仍然增加1,我需要让这个列从这个表中的最后一个id开始增加而不是删除的那个我该怎么办?

这是包含一些记录的datagridview: enter image description here

这是删除代码

if (comboBoxdelete.SelectedIndex != -1)
{
    SqlConnection con = new SqlConnection();
    SqlCommand cmd = new SqlCommand();
    con.ConnectionString = "Data Source=MOHAMEDSAFWAT;Initial    Catalog=Card;Integrated Security=True";
    cmd.CommandText = "DELETE FROM [Employee] WHERE [int]=@id1";
    cmd.Connection = con;
    cmd.Parameters.AddWithValue("@id1", comboBoxdelete.SelectedItem);
    con.Open();
    cmd.ExecuteNonQuery();
    con.Close();
    load();
    View();
}
else
{
    MessageBox.Show(" Please Insert  ID First");
}

1 个答案:

答案 0 :(得分:2)

标识列(在SQL-Sever中)由RDBMS处理。每次向表中添加一行时都会增加,当删除行时,RDBMS不会回滚标识列的基础序列。
表的ID或主键用于应用程序的内部使用。通常,您不得向用户显示它们 不要将id列用作最终用户的行号(因为向用户显示的任何内容都将是要求更新或删除的入侵者)
顺便说一句,我们认为我们需要手动实现id列以完全满足您的需求。 我们可以使用一种简单的方法:首先添加任何新行时,我们调用select来获取新的id:

SELECT ISNULL(count(*),0)+ 1 as newid from Employee

我们将拥有新的身份证明。
知道删除场景,认为我们有

Employee1-->id = 1 
Employee2-->id = 2 
Employee3-->id = 3 
Employee4-->id = 4 

现在我们删除Employee2所以需要做什么?
我们需要更新(在检测到要更新的行之后),以达到您的要求:

  Update Employee3 set id = 2 
  Update Employee4 set id = 3

表格中的所有行!
它不会在大量数据中工作,id是更新时的主键,所有子记录也必须更新,重新索引,表锁定......将是不可避免的。 所有这一切都是因为id列正在向用户显示,您需要按顺序显示它 对于这些方案,请使用Employee-Number之类的其他非关键列或RowNumber等UI级别列,不要向用户显示主键。