Параметризованный DataTable Split - PullRequest
0 голосов
/ 31 июля 2011

Я написал метод разбиения DataTable на несколько небольших таблиц данных; однако я получаю исключение. Как мне это исправить? Пожалуйста, поделитесь кодом.

Сообщение об исключении:

Эта строка уже принадлежит другой таблице.

Framework: .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 ]

1 голос
/ 25 февраля 2012

Используйте current.ImportRow(dr); вместо current.Rows.Add(dr);

1 голос
/ 31 июля 2011

Прежде чем добавить 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);
}
1 голос
/ 31 июля 2011

Используйте dt.Copy(); вместо dt.Clone();

0 голосов
/ 05 марта 2012

Я думаю, что эта функция не будет работать должным образом, попробуйте это, я внесу некоторые изменения в ваш код, он работает нормально

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

happy codding

0 голосов
/ 31 июля 2011

Вам просто нужно изменить строку, в которой вы добавляете строку данных в текущую таблицу данных. Используйте перегрузку, которая принимает массив объектов, чтобы создать новую строку. Таким образом, вы не клонируете и не копируете какие-либо строки, вместо этого создаете новую строку.

current.Rows.Add(dr.ItemArray);
0 голосов
/ 31 июля 2011

Вы можете удалить DataRow из исходного DataTable или создать новый DataRow и добавить его в новый DataTable.

...