한 Datatable에서 다른 DataTable로 행을 복사 하시겠습니까?


165

C #에서 DataTable의 특정 행을 다른 Datable로 복사하는 방법은 무엇입니까? 둘 이상의 행이 있습니다.

답변:


257
foreach (DataRow dr in dataTable1.Rows) {
    if (/* some condition */)
        dataTable2.Rows.Add(dr.ItemArray);
}

위의 예는 가정 dataTable1dataTable2동일한 수의 열을 입력 순서를 갖는다.


22
"이 행은 이미 다른 테이블에 속해 있습니다."라는 결과가 나타나지 않습니까?
McArthey 2016

15
@McArthey 아니요, 그렇지 않습니다. 기존 행의 값에서 새 행이 작성됩니다. 행 자체는 다른 DataTable에 추가되지 않습니다.
Bradley Smith

20
@DawoodAbbasi ItemArray표현의 끝에 부분 을 남겨둔 경우에만 발생합니다 . 행 자체가 아닌 행 값을 추가하고 있는지 확인하십시오.
Bradley Smith

4
@DawoodAbbasi DataTable.Clone방법 에 대해서는 MSDN 설명서를 참조하십시오 . msdn.microsoft.com/en-us/library/…
Bradley Smith

10
대답은 기술적으로 정확하지만 코드 샘플은 가정을 다루지 않습니다. @RageeshGr의 답변은 모든 가정을 처리하며 IMHO는보다 간결하게 작성되며 오류가 적습니다.
chris.nesbit1 12

94

지정된 행을 테이블에서 다른 행으로 복사

// here dttablenew is a new Table  and dttableOld is table Which having the data 

dttableNew  = dttableOld.Clone();  

foreach (DataRow drtableOld in dttableOld.Rows)
{
   if (/*put some Condition */)
   {
      dtTableNew.ImportRow(drtableOld);
   }
}

가져 오기 후에 더 이상 dttableOld를 사용할 필요가 없으면 여전히 Clone ()을 사용해야합니까?
Sam

위대하고 실용적입니다! 감사!
메이어 스피처

1
귀하의 질문에 관해서는 복제는 테이블 구조를 복사하는 것입니다. 테이블이 이미 동일한 데이터 유형 인 경우 필요하지 않습니다.
메이어 스피처

19

이 시도

    String matchString="ID0001"//assuming we have to find rows having key=ID0001
    DataTable dtTarget = new DataTable();
    dtTarget = dtSource.Clone();
    DataRow[] rowsToCopy;
    rowsToCopy = dtSource.Select("key='" + matchString + "'");
    foreach (DataRow temp in rowsToCopy)
    {
        dtTarget.ImportRow(temp);
    }

@ManojSavalia, 성능에 비용이 들지 않는 대안은 무엇입니까?
Sam

16

이것을 확인하십시오, 당신은 그것을 좋아할지도 모릅니다 (이전에는 table1을 table2로 복제하십시오) :

table1.AsEnumerable().Take(recodCount).CopyToDataTable(table2,LoadOption.OverwriteChanges);

또는:

table1.AsEnumerable().Where ( yourcondition  ) .CopyToDataTable(table2,LoadOption.OverwriteChanges);

이것은 모든 foreach 루프와 달리 .ForEach 메소드 기반 답변과 달리 내장 기능을 사용하여 명시 적으로 각 행을 반복하지 않고 범위를 복사하거나 한 DataTable에서 다른 행으로 행을 선택하기 때문에 훨씬 더 나은 방법입니다.
David Burg

15

4, 3.5 SP1에서 지원되므로 이제 객체에서 메소드를 호출 할 수 있습니다.

DataTable dataTable2 = dataTable1.Copy()

2
기술적으로 이것은 데이터 테이블의 복사본을 만듭니다. 질문에 명시 적으로 언급되어 있지는 않지만 dataTable2가 이미 존재하고 잃고 싶지 않은 다른 행이있을 수 있습니다. 또한 질문에는 구체적으로 "특정 행"이 명시되어 있지만 모든 행만 처리합니다.
Matt

5

다른 게시물의 결과로 이것이 내가 얻을 수있는 가장 짧은 것입니다.

DataTable destTable = sourceTable.Clone();
sourceTable.AsEnumerable().Where(row => /* condition */ ).ToList().ForEach(row => destTable.ImportRow(row));

기본적으로 foreach입니다. 또한 OP의 요청에 따라 조건을 통해 필터링하지 않습니다.
Eric Wu

이제 sourceTable유언장 destTable을 지우면?
Si8

대상을 지우지 않고 값을 할당하고 원래 변수를 지우고 싶습니다.
Si8

2

아래 샘플은 한 행을 복사하는 가장 빠른 방법입니다. 각 셀은 열 이름을 기준으로 복사됩니다. 복사 할 특정 셀이 필요하지 않은 경우 try catch를 추가하거나 if를 추가하십시오. 둘 이상의 행을 복사하려는 경우 아래 코드를 반복하십시오.

DataRow dr = dataset1.Tables[0].NewRow();
for (int i = 0; i < dataset1.Tables[1].Columns.Count; i++)
{
    dr[dataset1.Tables[1].Columns[i].ColumnName] = dataset1.Tables[1].Rows[0][i];
}

datasetReport.Tables[0].Rows.Add(dr);

데이터 세트 1. 테이블 [1]. 행 [ 0 ] [i]; 인덱스 0을 지정된 행 인덱스로 변경하거나 루프하거나 논리적 인 경우 변수를 사용할 수 있습니다.


1
 private void CopyDataTable(DataTable table){
     // Create an object variable for the copy.
     DataTable copyDataTable;
     copyDataTable = table.Copy();
     // Insert code to work with the copy.
 }

귀하의 코드는 저에게 완벽하게 작동하며 매우 간단한 코드입니다
Esraa_92

1

단일 명령 SQL 쿼리를 원하는 사람들을 위해 :

INSERT INTO TABLE002 
(COL001_MEM_ID, COL002_MEM_NAME, COL002_MEM_ADD, COL002_CREATE_USER_C, COL002_CREATE_S)
SELECT COL001_MEM_ID, COL001_MEM_NAME, COL001_MEM_ADD, COL001_CREATE_USER_C, COL001_CREATE_S
FROM TABLE001;

이 쿼리는 데이터를 복사 할 TABLE001TABLE002우리는 모두 열이 다른 열 이름을 가지고 있다고 가정합니다.

열 이름은 다음과 같이 일대일로 매핑됩니다.

COL001_MEM_ID-> COL001_MEM_ID

COL001_MEM_NAME-> COL002_MEM_NAME

COL001_MEM_ADD-> COL002_MEM_ADD

COL001_CREATE_USER_C-> COL002_CREATE_USER_C

COL002_CREATE_S-> COL002_CREATE_S

조건이 필요한 경우 where 절을 지정할 수도 있습니다.


0

전체 데이터 테이블을 복사하려면 다음을 수행하십시오.

DataGridView sourceGrid = this.dataGridView1;
DataGridView targetGrid = this.dataGridView2;
targetGrid.DataSource = sourceGrid.DataSource;

2
문제는 전체가 아닌 데이터 테이블에서 특정 행을 복사하는 방법에 관한 것입니다.
Jtate

0

이 문제를 해결하는 쉬운 방법을 만들었습니다.

 DataTable newTable = oldtable.Clone();    
 for (int i = 0; i < oldtable.Rows.Count; i++)
 {
   DataRow drNew = newTable.NewRow();    
   drNew.ItemArray = oldtable.Rows[i].ItemArray;    
   newTable.Rows.Add(drNew);   
 } 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.