【问题标题】:Database and DataSet are not synced regarding auto incrementing ID关于自动递增 ID,数据库和数据集未同步
【发布时间】:2016-01-13 01:50:27
【问题描述】:

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

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

然后我构建了一个包含此表作为 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 手动删除行,它第一次运行良好,之后我得到同样的错误。

问题出在我尝试保存数据集时,尤其是在添加新行时(选择、更新、删除都可以)。

很明显,当涉及到DataTable和数据库时,我没有得到如何管理主键(单独的datatable就可以了)。 特别是要同步两者...

我错过了什么? 我很确定我误解了一些东西。

【问题讨论】:

    标签: c# database datatable auto-increment dataadapter


    【解决方案1】:

    根据MSDN

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

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

    【讨论】:

    • 非常感谢,我不知道!
    猜你喜欢
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多