我写了一个将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);
}
答案 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;
}
快乐编码