我在 ASP.NET 端使用带有插入/更新/删除按钮的列表框,当我删除学生时,学生 ID 不再与 ID 列相等。因此,当我删除一个学生时,列表框中的顺序不等于 SQL 端。我怎样才能自动同步这两个?我已将主键和身份规范设置为活动,供您参考。并包括以下问题的屏幕截图。
3 回答
一个 ASP.NET 列表框应该有一个键属性和一个值属性。
通常,键属性将使用数据库中的 ID 填充...当删除列表框中的选定项时,您将根据键属性而不是选定列表框项的索引进行删除。
无论您做什么,都不要将数据库中的 ID 重新编号为连续的。这会给你带来巨大的问题。
ASP.NET 上的列表框项必须由ListBox1.SelectedValue
而不是 SelectedIndex 控制。一旦您删除了一个项目并且订单发生了变化,一个项目的 SelectedIndex 可能会发生变化。这样做会很混乱。
但是,ListBox1.SelectedValue
将帮助您通过其值(即EmployeeID,而不是SQL表中的顺序来控制每个项目。当您创建一个列表项时,您必须将这种情况下的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();
您所说的“ID 列”实际上只是 SSMS 查询返回的行号。这与返回的记录没有关系,只是它们被返回的顺序。以以下查询为例:
SELECT * FROM ali ORDER BY OgrenciID ASC
SELECT * FROM ali ORDER BY OgrenciID DESC
两个查询都返回相同的数据,只是顺序不同。SQL 没有“保证”的方式来对数据进行排序,除非您提供 order by。这意味着在输入足够的数据后,您的查询不会总是显示 1、2、3。相反,它可能会显示 1、3、2,除非您另有说明。
拥有标识列的目的是确保每一行数据都有一个唯一的 ID。假设您有第二个名为 Permissions 的表,它通过 OgrenciID 链接到该表。如果用户 1 被删除,您不希望用户 2 获得用户 1 的权限。
如果要从该表中删除所有数据并将 ID 列重置为 1,则必须在删除记录后截断表或重置键。但是,这将需要彻底擦除桌子。