2009-12-03 6 views
3

У меня есть datatable say dt1 (который продолжает меняться внутри цикла). У меня есть другой datatable say dt2 (изначально его null). Теперь мне нужно добавить строки dt1 в dt2. Я попытался использовать Merge(), но предыдущие строки dt2 исчезают. Любая идея Как это сделать ??Как добавить строку в Datatable?

ответ

1

Вы очистное таблицу dt2 каждый раз, когда цикл выполняется. Попробуйте это:

DataTable dt1 = null; DataTable dt2 = null; 

for (int i = 0; i < dt3.Rows.Count; i++) 
{ 

    // here "strSQL" is build which changes on the "i" value     

    dt1 = GetDataTable(strSQL); // this returns a table with single Row 

    if(dt2 == null) 
    { 
     dt2 = dt1.Clone(); 
    } 

    dt2.Merge(dt1,true); 
} 

Кроме того, если ограничение запроса на основе i применяется к столбец первичного ключа вы можете использовать

dt2.ImportRow(dt1.Rows[0]); 

вместо

dt2.Merge(dt1,true); 
+0

Merge работает нормально. – Avi

1

Основываясь на вашем коде, я вижу, что вы используете dt2 = dt1.Clone(); Это вытирает все содержимое в dt2, поэтому вы добавляете только текущее содержимое dt1 в dt2.

Вместо клонирования вы должны просто объединить содержимое dt1 в dt2.

+0

Для первой очереди я получаю ошибку (ссылка объекта не установлена ​​в экземпляр объекта.). И для dt2.Merge (dt1, true) предыдущие строки удаляются при последующей функции слияния. – Avi

+0

не могли бы вы вставить код в свой вопрос, чтобы мы могли видеть, что происходит? Потому что мой ответ обычно должен работать. – Webleeuw

0

Что об этом:

DataRow[] rows = new DataRow[dt1.Rows.Count]; 
    dt1.Rows.CopyTo(rows, 0); 
    foreach (DataRow row in rows) 
    { 
    dt2.Rows.Add(row); 
    } 
+0

Это не сработает. – SLaks

+0

О, извините, это будет работать. – martin

1

Используйте ImportRow метод, как это:

var table2 = new DataTable(); 

foreach(DataRow row in table1.Rows) 
    table2.ImportRow(row); 
0

я принимаю ваши таблицы имеют одинаковую структуру

foreach (DataRow row in dt1.Rows) 
    dt2.Rows.Add(row.ItemArray); 
1

Другой производной к João Анджело Ответ будет состоять в том, чтобы инициализировать dt2 раньше времени, а затем вы можете удалить нулевую проверку.

DataTable dt1 = null; DataTable dt2 = new DataTable(); 

for (int i = 0; i < dt3.Rows.Count; i++) 
{ 

    // here "strSQL" is build which changes on the "i" value     

    dt1 = GetDataTable(strSQL); // this returns a table with single Row 

    dt2.Merge(dt1,true); 
} 
Смежные вопросы