在DataTable已有数据的情况下设置自动编号

5

我有以下代码来为DataTable添加自动编号列:

public void AddAutoIncrementColumn(DataTable dt)
{
   DataColumn column = new DataColumn();
   column.DataType = System.Type.GetType("System.Int32");
   column.AutoIncrement = true;
   column.AutoIncrementSeed = 0;
   column.AutoIncrementStep = 1;
   dt.Columns.Add(column);
}

然而,对于已经存在于表中的所有行,此值将为空;似乎自动递增仅在添加此列后添加的新行才会被触发。有没有办法为已经存在的行设置自动编号值?


1
在添加了该列之后,您可以更新所有现有行。 - Tim Schmelter
你能不能在添加数据之前先添加列? - D Stanley
@DStanley,有些情况下我无法首先添加它,比如使用OleDbDataAdapter.Fill() - sigil
@sigil 这是一个很好的问题。如果你来自 SQL Server 的背景,你会期望一个自动增量(SQL 中的 IDENTITY)列在被添加到现有表中时会自动填充值,而无需干预。但在 ADO 数据表中并非如此。 - SQLServerSteve
4个回答

10

我认为当行已经存在于表中时,不可能触发AutoIncrement功能。但您可以轻松手动更新表:

public void AddAutoIncrementColumn(DataTable dt)
{
    DataColumn column = new DataColumn();
    column.DataType = System.Type.GetType("System.Int32");
    column.AutoIncrement = true;
    column.AutoIncrementSeed = 0;
    column.AutoIncrementStep = 1;
    dt.Columns.Add(column);
    int index = -1;
    foreach (DataRow row in dt.Rows)
    {
        row.SetField(column, ++index);
    }
}

我该如何使用LINQ来实现它? - b.g

2
我对@Programnik的解决方案进行了修改。
DataTable dt = LoadDataTable();
using (DbDataReader dr = dt.CreateDataReader())
{
    //Get Original Datatable structure
    dt = dt.Clone();

    // Add Auto Increment Column called ID
    dt.Columns.Add(new DataColumn("ID")
    {
        AutoIncrement = true,
        AllowDBNull = false,
        AutoIncrementSeed = 1,
        AutoIncrementStep = 1,
        DataType = typeof(System.Int32),
        Unique = true
    });

    // Change Auto Increment Column Ordinal Position to 0 (ie First Column)
    dt.Columns["TabID"].SetOrdinal(0);

    // Re-load original Data
    dt.Load(dr);
}

1

我认为有一种更简单的方法,不需要遍历所有行。Datatable上有一个叫做CreateDataReader的方法。因此,克隆原始datatable,添加identity列,从原始表中创建datareader,然后使用数据读取器将克隆表加载数据。这将在identity列中生成数字,例如:

// original data table
DataTable origDT;

// create a reader
DataReader dr = origDT.CreatDataReader();

//clone original
DataTable clonedDT  = origDT.Clone();

//add identity column
clonedDT.Columns.Add(new DataColumn(){AutoIncrement=true});

//load clone from reader, identity col will auto-populate with values
clonedDT.Load(dr);

0
这对我有用。我试图从另一个表中获取唯一值,并为它们分配新的ID。
        DataTable FinalNest = new DataTable();
        FinalNest.Columns.Add(new DataColumn("CuttingPlan", typeof(int)) { AutoIncrement = true, AutoIncrementSeed = 1, AutoIncrementStep = 1 });
        FinalNest.Columns.Add("Material", typeof(string));
        FinalNest.Columns.Add("IncludedPartIDs", typeof(string));
        DataTableReader dr = cutPlan.DefaultView.ToTable(true, "Material", "IncludedPartIDs").CreateDataReader();
        FinalNest.Load(dr);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接