我在ASP.NET端使用带有插入/更新/删除按钮的列表框,当我删除学生时,学生ID不再与ID列相等。因此,当我删除学生时,列表框中的顺序不等于SQL端。如何自动同步这两个?我已将主键和标识规范集设置为活动,以供您参考。并包括下面问题的截图。
答案 0 :(得分:1)
ASP.NET列表框应具有键属性以及值属性。
通常, key 属性将填充数据库中的ID ...当删除列表框中的选定项目时,您将根据键属性,而不是所选列表框项的索引。
Here's a quick tutorial that shows how to populate a list box with key / value pairs
无论您做什么,不要将数据库中的ID重新编号为顺序。这会给你带来很大的麻烦。
答案 1 :(得分:1)
ASP.NET上的列表框项必须由ListBox1.SelectedValue
控制,而不是由SelectedIndex控制。删除项目并更改订单后,项目的SelectedIndex可能会更改。这样做会很混乱。
但是,ListBox1.SelectedValue
可以帮助您按值控制每个项目(这是EmployeeID,而不是SQL表中的顺序。当您创建listitem时,您必须在这种情况下将EmployeeID赋予HTML列表框的值,当您插入或更新项目时将使用ListBox1.SelectedValue
处理
the code when you retrieve data from SQL to the listbox should look like this:
cnn.Open();
SqlCommand cmd = new SqlCommand("SELECT FirstName,LastName,EmployeeID FROM Employees", cnn);
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
while (dr.Read())
{
ListBox1.Items.Add(new ListItem(dr.GetString(0) + " " + dr.GetString(1),dr.GetInt32(2).ToString()));
}
}
cnn.Close();
答案 2 :(得分:0)
您所指的“ID列”实际上只是SSMS查询返回的行号。这与返回的记录没有关系,只是它们被返回的顺序。例如,以下查询:
SELECT * FROM ali ORDER BY OgrenciID ASC
SELECT * FROM ali ORDER BY OgrenciID DESC
两个查询都以不同的顺序返回相同的数据。除非您按顺序提供订单,否则SQL没有“保证”方式对数据进行排序。这意味着在输入足够的数据后,您的查询将不会始终显示1,2,3。相反,它可能会显示1,3,2,除非您另有说明。
拥有标识列的目的是确保每行数据都具有唯一ID。假设你有一个名为Permissions的第二个表,它被OgrenciID链接到该表。如果用户1被删除,您不希望用户2获得用户1的权限。
如果要删除该表中的所有数据并将ID列重置为1,则必须在删除记录后截断表或重置密钥。但是,这需要彻底擦除表格。