2011-07-31 58 views
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); 
} 

回答

0

您可以從源數據表中刪除的DataRow或創建一個新的DataRow,並把它添加到新的DataTable。

1

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

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); 
} 
0

你只需要改線,你將數據行添加到當前數據表中。使用接受對象數組來創建新行的重載。這樣您就不會複製或複製任何行,而是創建一個新行。

current.Rows.Add(dr.ItemArray); 
1

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

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; 
} 

快樂作弄