参数化DataTable Split

时间:2011-07-31 11:01:15

标签: c# .net sql-server ado.net .net-3.0

我写了一个将DataTable拆分成多个小数据表的方法;但我得到例外。我该如何纠正?请分享代码。

异常消息:

  

此行已属于另一个表。

框架:.Net 3.0

private static List<DataTable> SplitDataTable(DataTable dt, int size)
{
    List<DataTable> split = new List<DataTable>();
    DataTable current = dt.Clone();
    int iterator = 0;
    foreach (DataRow dr in dt.Rows)
    {
        iterator = iterator + 1;
        if (iterator == size)
        {
            current = dt.Clone();
            split.Add(current);
            iterator = 0;
        }
        current.Rows.Add(dr);
        //Exception: This row already belongs to another table.
    }
    return split;
}

客户端:

static void Main(string[] args)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("TEST", typeof(int));
    dt.Columns.Add("VAL", typeof(string));
    dt.Rows.Add(0,"a");
    dt.Rows.Add(1,"b");
    dt.Rows.Add(2,"c");
    dt.Rows.Add(3,"d");

    List<DataTable> split = SplitDataTable(dt, 2);
}

6 个答案:

答案 0 :(得分:1)

使用dt.Copy();代替dt.Clone();

答案 1 :(得分:1)

在将DataRow添加到克隆数据表之前,需要将其从原始数据源中删除:

foreach (DataRow dr in dt.Rows)
{
   iterator = iterator + 1;

   if (iterator == size)
   {
      current = dt.Clone();
      split.Add(current);
      iterator = 0;
   }

   dt.Rows.Remove(dr);   // remove it from the source FIRST, then add it to the cloned DataTable
   current.Rows.Add(dr);
}

答案 2 :(得分:1)

使用current.ImportRow(dr);代替current.Rows.Add(dr);

答案 3 :(得分:0)

您可以从源DataTable中删除DataRow,也可以创建一个新的DataRow并将其添加到新的DataTable中。

答案 4 :(得分:0)

您只需更改将数据行添加到当前数据表的行。使用带有对象数组的重载来创建新行。这样您就不会克隆或复制任何行,而是创建一个新行。

current.Rows.Add(dr.ItemArray);

答案 5 :(得分:0)

我认为此功能无法正常试试 我对你进行了一些修改,使其工作正常

private static List<DataTable> SplitDataTable(DataTable dt, int size)
{
    List<DataTable> split = new List<DataTable>();
    DataTable current = dt.Clone();

    int iterator1 = 0;
    foreach (DataRow dr in dt.Rows)
    {
        if (current.Rows.Count < size)
        {
            current.Rows.Add(dr.ItemArray);

        }
        if (current.Rows.Count == size)
        {
            iterator1= iterator1+size;
            split.Add(current);
            current = dt.Clone();
        }
    }
    if (iterator1 < dt.Rows.Count) { split.Add(current); }
    return split;
}

快乐编码