繁体   English   中英

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

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

我有一个连接到我的 sql 数据库的 datagridview。 它看起来像这样

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 中删除身份和约束,但没有结果

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

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

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

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

当您将学校保存到 db 时(并且您需要先保存学校,以便与学生相关联),DB 将生成一个实际的学校,例如 427

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

  • 学校 ID 为 -1
  • 十个学生的 SchoolId -1
  • 学校被保存并在 dB 中获得 427
  • DataSet 中的 school 对象得到 427
  • 学生对象更新为 427

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM