数据库和DataSet不会同步自动递增ID

时间:2015-10-14 19:52:22

标签: c# database datatable auto-increment dataadapter

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

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

然后我构建了一个包含此表作为DataTable的DataSet,我有一个像这样的DataAdapter:

        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(NEWROW)
  • adapter.Update(dataSet,tableName)

如果我不做任何其他事情,稍后当我尝试获取此行的ID时我会遇到问题(我想它会将其设置在上述四条指令之间)。 我期待DataTable能够生成一个,但是......

所以我尝试提醒DataTable来处理自动递增:

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

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

问题实际上是当我尝试保存我的DataSet时,特别是在添加新行时(选择,更新,删除很好)。

显然,当涉及DataTable和数据库时,我没有得到如何管理主键(仅数据表是可以的)。 特别要同步两个......

我错过了什么? 我很确定我误解了一些事情。

1 个答案:

答案 0 :(得分:1)

根据MSDN

  

默认情况下,更新后会隐式调用AcceptChanges,并且行中的原始值(可能是ADO.NET指定的AutoIncrement值)将丢失。

因此,您需要创建一个策略来合并AutoIncremented值,或者通过ADO或从Sql返回增加的Id作为输出参数,然后按照此MSDN Article中的指示合并Identity列值。