【问题标题】:C# DataTable: Add new row throws error using AutoInc fieldC# DataTable:使用 AutoInc 字段添加新行引发错误
【发布时间】:2009-11-21 15:00:09
【问题描述】:

我有一个收藏

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 列被“忽略”

谢谢

【问题讨论】:

    标签: c# collections datatable auto-increment datarow


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • OMFG...这是地狱!!!我不可能只为了能够向表中添加记录而不会遇到表中的 id 字段出现问题而做所有这些事情我想我会使用自动方式
    • 真的没那么糟糕。您只需要做三件事 - 正确设置自动递增、在插入后更新 ID 以及将 DataRelations 设置为级联更新 - 如果您的表参与关系,您只需要做第三件事。跨度>
    【解决方案2】:

    你是怎么摆桌子的?

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

    【讨论】:

    • 我的 mdb 文件只有一个表“Employee”,它有一些字段,并且还有一个主键设置为自动数字 (autoinc)。当我在我的 List 中添加一些数据时,我必须在 mdb 中也反映此更改,但它不允许我发布没有 id 字段的新记录...
    猜你喜欢
    • 2014-10-04
    • 2015-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-03
    • 2014-05-20
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多