代码之家  ›  专栏  ›  技术社区  ›  Enrique

C dataTable:使用autoinc字段添加新行throws错误

  •  1
  • Enrique  · 技术社区  · 15 年前

    我有收藏

    List<Employee> employees;
    

    我使用一个数据表,在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列,所以键入number、autoinc, 如何修复Employee类和DataTable/Collections方法,以便在添加新行时“忽略”ID列 是吗?

    谢谢

    2 回复  |  直到 15 年前
        1
  •  2
  •   Robert Rossney    15 年前

    第一个问题是, id 列在数据库中自动递增, DataColumn 在您的 DataTable 未设置为自动递增。你需要设置它 AutoIncrement , AutoIncrementSeed AutoIncrementStep 属性。

    一旦这样做,您将遇到第二个问题,即您有两个不同的自动增量种子:数据库中的种子和 可计算的 . 即使这两个种子以相同的值开始,它们也很容易失去同步:向您的 可计算的 以及与数据库表不同的行,现在您有两个具有相同ID的不同行。

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

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

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

        2
  •  0
  •   ChrisF    15 年前

    你怎么摆好桌子的?

    此代码来自 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;
    }