c#datagridview中的第一列正在增加负值

c# first column in datagridview is getting incremented with negative values

我有一个连接到我的 sql 数据库的数据网格视图。看起来像这样

create table Scule
(
    id int  Identity constraint pk_idscule Primary key, 
    unelte varchar(255),
    nume_persoana varchar (255),
    data_luat date,
    data_adus date
);

每当我在 datagridview 中添加一些东西时,我的 id 就会增加,但只是视觉上的值从 -1 开始下降..在数据库中它保存得很好。我正在使用 windows 表单 c#。如果我在最后两行之间切换,它只会无缘无故地越来越低。我试图从 sql 中的 id 中删除标识和约束,但没有结果

是的,这就是它的工作原理。我怀疑你有一个 datatable 作为你的网格的支持,主键列被指定为以负步自动递增(当你创建一个 DataSet 并用 DataTables 和 TableAdapters 填充它时的典型行为)

重要的是要记住 DataSet 与数据库毫无关系;它与数据库无关。它是一组本地容器,当您在表单上显示数据并使用它时,数据就保存在其中。适配器从数据库加载它并将其保存到数据库

这种自动负数是一种机制,它允许您在本地数据集中拥有满足“主键作为数字”约束的数据,还允许您以相关方式将数据保存在一起。所以你有一个 Scule - 我会假装那是一所学校,人们在那里学习东西。学校有学生,所以您可能还有 table 名学生。每个学生都有一个将他们关联到学校的 SchoolId。这意味着您可以在学校和学生之间建立关系

当您添加新学校时,它的 ID 为 -1。如果您添加 10 个学生,他们的 ID 将在 -1 到 -10 之间,他们的 SchoolId 将为 -1

当您将学校保存到数据库中时(并且您需要先保存学校,以便将学生关联起来),数据库将生成一个实际的学校,例如 427

通过魔法(实际上是通过 运行 SELECT SCOPE_IDENTITY() 在数据库中创建学校的插入之后)DataSet 将下载 427 的实际值并用它替换 -1。如果您将其配置为级联此更新(您应该),那么所有相关学生(保存前学校 ID 为 -1 的学生)如果更新为 427,也将拥有他们的学校。这样数据仍然关联在一起:

  • 学号是-1
  • 十个学生的 SchoolId -1
  • 学校得救并获得 427 分贝
  • DataSet 中的学校对象获得 427
  • 学生对象更新为 427

学生现在可以全部保存到数据库中,他们将与学校427相关联


大多数情况下你应该忽略这个 -1 值 - 你只是因为你可以看到它而烦恼,但通常我们不会向用户显示主键。当你在最后一行和倒数第二行之间移动时,你会发现 ID 不断减少,因为进入最后一行会产生一个新的临时表,但你永远不会填写它,所以它永远不会提交。为了防止出现问题,临时的永远不会被重用,所以负增量不断发生。别担心,这在宏伟的计划中绝对不重要。您可以为自己和您的用户姐姐做的最好的事情是从网格中删除 PK 列,这样您就不会看到这种情况发生