1

我有一个收藏

List<Employee> employees;

我使用 DataTable,并在 Form1.Loads 时加载所有记录(来自 MDB 表),并将这些记录添加到列表(集合)中,以便我在内存中使用它们。

现在,当我将新员工添加到集合中时,我也应该将其添加到 mdb 表中......所以我这样做:

DataRow rowemployee = Program.tblEmployee.NewRow();
rowemployee["name"] = tb_Name.Text;
rowemployee["address"] = tb_Address.Text;
//...all the other fields
Program.tblEmployee.AddRow(rowemployee);

IDE 抛出有关“id”列不能有空值或不能为空的错误。
由于 mdb 表有一个 id 列、类型号、autoinc,我应该如何修复 Employee 类和 DataTable/Collections 方法,所以在添加新行时 id 列被“忽略”

谢谢

4

2 回答 2

3

第一个问题是,虽然该id列在您的数据库中是自动递增的,但在您的数据库DataColumn中与之对应的对象DataTable并未设置为自动递增。您需要设置它的AutoIncrementAutoIncrementSeedAutoIncrementStep属性。

一旦你这样做了,你就会遇到第二个问题,即你有两个不同的自动增量种子:一个在你的数据库中,一个在你的DataTable. 即使这两个种子以相同的值开始,它们不同步也是微不足道的:在您的数据库表中添加一行,DataTable在您的数据库表中添加另一行,现在您有两个具有相同 ID 的不同行。

这是一个常见问题,其常见解决方案是为添加到DataTable. 通常这是通过将种子设置为 0 并将步长设置为 -1 来完成的,这样您添加到的所有行的DataTableID 都小于 0。(这当然假设数据库中的所有 ID 都大于0。 ) 这意味着在数据库中添加的行和添加到DataTable.

然后,当您从 实际更新数据库时DataTable,将行插入数据库并分配其真实ID 后,将 中的 ID 更改为DataRow正确的值。如果该行作为父行参与数据关系,则DataColumn必须设置级联更新,以便将父行中的 ID 从其临时本地值更改为其永久值也会更改相关子行中的 ID。

使用类型化数据集和表适配器的众多原因之一是所有这些工作都是自动为您完成的。但是,如果您不使用表适配器,则必须自己做。ADO 文档中有一个很好的例子

于 2009-11-21T20:09:02.127 回答
0

你是怎么摆桌子的?

此代码来自DataRow.ItemArrayProperty MSDN 页面,该页面说明了如何AutoIncrement使用该属性。

private DataTable MakeTableWithAutoIncrement()
{
    // Make a table with one AutoIncrement column.
    DataTable table = new DataTable("table");
    DataColumn idColumn = new DataColumn("id", 
        Type.GetType("System.Int32"));
    idColumn.AutoIncrement = true;
    idColumn.AutoIncrementSeed = 10;
    table.Columns.Add(idColumn);

    DataColumn firstNameColumn = new DataColumn("Item", 
        Type.GetType("System.String"));
    table.Columns.Add(firstNameColumn);
    return table;
}
于 2009-11-21T15:13:50.290 回答