数据库和数据集在自动增加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单独是可以的)。特别是要同步两个…
我错过了什么?我敢肯定我误解了什么。
根据MSDN
默认情况下,
AcceptChanges
在更新后隐式调用,并且行中的原始值可能是ADO分配的AutoIncrement值。
因此,您需要创建一个策略来合并autoincreded值,可以通过ADO或从Sql中获取增量Id作为输出参数,然后合并Identity列值,如这篇MSDN文章所示。