C#DataTable:使用AutoInc字段添加新行抛出错误

时间:2009-11-21 15:00:09

标签: c# collections datatable auto-increment datarow

我有一个集合

List<Employee> employees;

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

现在,当我向集合中添加一个新员工时,我应该将它添加到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列?< / p>

由于

2 个答案:

答案 0 :(得分:2)

第一个问题是,当id列在您的数据库中自动递增时,DataColumn中与其对应的DataTable对象未设置为自动递增。您需要设置其AutoIncrementAutoIncrementSeedAutoIncrementStep属性。

执行此操作后,您将遇到第二个问题,即您有两个不同的自动增量种子:数据库中的种子和DataTable中的种子。即使这两个种子以相同的值开始,但它们不同步也是微不足道的:向DataTable添加一行,向数据库表添加不同的行,现在你有两个不同的行相同的ID。

这是一个常见问题,其常见解决方案是为添加到DataTable的行设置不同的编号顺序。通常,这是通过将种子设置为0并将步骤设置为-1来完成的,这样您添加到DataTable的所有行都具有小于0的ID。(这当然假定数据库中的所有ID 大于 0.)这意味着数据库中添加的行与添加到DataTable的行之间不存在ID冲突的可能性。

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

使用类型化数据集和表适配器的众多原因之一是所有这些工作都是自动完成的。但是如果你不使用表适配器,你必须自己做。在the ADO documentation

中有一个很好的例子

答案 1 :(得分:0)

你是如何设置表的?

此代码来自DataRow.ItemArray Property MSDN page,其中说明了如何使用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;
}