数据库和数据集在自动增加ID方面不同步

本文关键字:增加 ID 方面不 同步 数据集 数据库 | 更新日期: 2023-09-27 18:17:40

我使用Visual Studio和一个包含两个字段的表构建了一个数据库(Microsoft SqlServerCe.4.0):

  • id: int,主键,非空,唯一,无默认值,标识
  • nom,我们并不关心这个

然后我建立了一个包含这个表作为数据表的数据集,我有一个像这样的数据适配器:

        marque_adapter = factory.CreateDataAdapter();
        command = connection.CreateCommand();
        command.CommandText = "SELECT * FROM " + DB_TABLE_MARQUE + ";";
        marque_adapter.SelectCommand = command;
        command = connection.CreateCommand();
        command.CommandText = "UPDATE " + DB_TABLE_MARQUE + " SET nom = @nom WHERE id = @id;";
        CreateAndAddParameterFromSource(command, "id", "id");
        CreateAndAddParameterFromSource(command, "nom", "nom");
        marque_adapter.UpdateCommand = command;
        command = connection.CreateCommand();
        command.CommandText = "DELETE " + DB_TABLE_MARQUE + " WHERE id = @id;";
        CreateAndAddParameterFromSource(command, "id", "id");
        marque_adapter.DeleteCommand = command;
        command = connection.CreateCommand();
        command.CommandText = "INSERT INTO " + DB_TABLE_MARQUE + " (nom) VALUES (@nom);";
        CreateAndAddParameterFromSource(command, "nom", "nom");
        marque_adapter.InsertCommand = command;
        //...
        data = new DataSet();
        marque_adapter.Fill(data, DB_TABLE_MARQUE);

当我尝试插入新行时,问题出现了。我喜欢:

  • table.NewRow ()
  • 设置"nom"字段
  • table.Rows.Add(启动)
  • 适配器。更新(数据表)

如果我不做任何其他事情,稍后当我试图获得这一行的ID时,我就会遇到问题(我猜它会将它设置在上面四个指令之间的某个地方)。我希望DataTable负责生成一个,但是…

所以我试着提醒DataTable注意自动递增:

idColumn.Unique = true;
idColumn.AutoIncrement = true;

现在它第一次工作了,但是当我第二次运行程序时,它又开始从1开始计数,我被告知ID应该是唯一的。如果我删除数据库(由Visual创建的sdf文件的副本),或者如果我使用Visual手动删除行,它第一次运行良好,然后我得到相同的错误。

问题真的是当我试图保存我的数据集,特别是当添加新行(选择,更新,删除是好的)。

显然,当涉及到DataTable和数据库时,我不知道如何管理主键(DataTable单独是可以的)。特别是要同步两个…

我错过了什么?我敢肯定我误解了什么。

数据库和数据集在自动增加ID方面不同步

根据MSDN

默认情况下,AcceptChanges在更新后隐式调用,并且行中的原始值可能是ADO分配的AutoIncrement值。

因此,您需要创建一个策略来合并autoincreded值,可以通过ADO或从Sql中获取增量Id作为输出参数,然后合并Identity列值,如这篇MSDN文章所示。