【发布时间】: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