2011-07-31 4 views
0

J'ai écrit une méthode pour diviser un DataTable en plusieurs tables de petites données; Cependant, je reçois une exception. Comment puis-je le corriger? S'il vous plaît partager le code.Parameterized DataTable Split

Message d'exception:

Cette ligne appartient déjà à une autre table.

Cadre: .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; 
} 

Client:

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

Répondre

0

Vous pouvez retirer le DataRow de la source DataTable ou créez un nouveau DataRow et l'ajouter à la nouvelle DataTable.

1

Utilisation dt.Copy(); au lieu de dt.Clone();

1

Avant d'ajouter un DataRow à votre clone datatable, vous devez le retirer de la source d'origine datatable:

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

Vous avez juste besoin de changer la ligne où vous ajoutez la ligne de données à la table de données actuelle. Utilisez la surcharge qui prend un tableau d'objets pour créer une nouvelle ligne. De cette façon, vous ne clonez ou ne copiez aucune ligne, mais créez une nouvelle ligne.

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

Utilisation current.ImportRow(dr); au lieu de current.Rows.Add(dr);

0

Je pense que cette fonction ne fonctionne pas correctement, essayez ce je fais quelques modifications sur vous le code, il fonctionne très bien

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

heureux Codding