datarow 배열을 데이터 테이블로 변환하는 간단한 방법


98

DataRow배열을 DataTable... 로 변환하고 싶습니다. 이 작업을 수행하는 가장 간단한 방법은 무엇입니까?

답변:


91

DataRow 배열을 반복하고 다음과 같이 추가 (필요한 경우 DataRow.ImportRow 사용)하여 다음과 같이 추가하지 않는 이유는 무엇입니까?

foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

dataTable에 DataRow 배열의 DataRows와 동일한 스키마가 있는지 확인하십시오.


1
이 기술은 DataRow를 컨트롤의 DataSource 속성에 직접 바인딩하려고 할 때 "잘못된 데이터 소스가 MyControl에 사용되고 있습니다. 유효한 데이터 소스는 IListSource 또는 IEnumerable을 구현해야합니다."라는 오류 메시지가 표시되는 경우 유용합니다. 방법은 다음과 같습니다.DataTable dataTable = new DataTable(); dataTable.ImportRow(dataRow); MyControl.DataSource = dataTable;
humbads

+1 rowArray.CopyToDataTable();이것은 테이블 스키마를 유지하고 새 테이블 객체로 대체하지 않기 때문에 선호 합니다!
Mojtaba Rezaeian

7
아주 좋아요! 그러나 foreach 전에 DataTable을 복제하는 것이 좋습니다. DataTable의 형식을 복사합니다. newDataTable = oldDataTable.clone ();
Whiplash 2016 년

2
힌트 : 데이터 테이블에 생성 된 열이 있어야합니다. 그렇지 않으면 올바르게 채워지지 않습니다.
물류 학자

192

.Net Framework 3.5 이상

DataTable dt = new DataTable();
DataRow[] dr = dt.Select("Your string");
DataTable dt1 = dr.CopyToDataTable();

그러나 배열에 행이 없으면 The source contains no DataRows 와 같은 오류가 발생할 수 있습니다 . 따라서이 방법을 사용하기로 결정한 경우 CopyToDataTable()배열에 데이터 행이 있는지 여부를 확인해야합니다.

if (dr.Length > 0)
    DataTable dt1 = dr.CopyToDataTable();

MSDN에서 사용 가능한 참조 : DataTableExtensions.CopyToDataTable 메서드 (IEnumerable)


1
어디서 났어 copyToDataTable()? .net 2.0에서 찾지 못했습니다
SMUsamaShah 2011 년

11
copyToDataTable()method가 선택한 행의 열에 대한 완벽한 사본을 생성하는 반면 datatable.ImportRow(row)method는 생성 하지 않기 때문에 정답으로 표시되어야합니다.
Dante

5
이 방법은 테이블에 이미 행이 있으면 좋지 않습니다. 시작하기 위해 테이블이 비어 있으면 괜찮습니다.
Franck

5
.Net 기능이 최적화되어있는 한이 방법을 선호합니다. 이 방법은 (나처럼)없는 이유를 직접 물어 frustated되지 않도록 프로젝트에 System.Data.DataSetExtensions에 대한 참조를 추가하는 것을 잊지 마세요
Broken_Window

참조에 System.Data.DataSetExtensions 어셈블리를 추가하는 것을 잊지
마십시오

12
DataTable dt = new DataTable(); 

DataRow[] dr = (DataTable)dsData.Tables[0].Select("Some Criteria");

dt.Rows.Add(dr);

2
나는 이미 그렇게 시도했다 .. "입력 배열이이 테이블의 열 수보다 깁니다."와 같은 오류가 발생합니다.
Developer404

Jay가 지적한대로 dataTable이 DataRow 배열의 DataRows와 동일한 스키마를 가지고 있는지 확인하십시오
Mitch Wheat

1
네 .. 시도했습니다. 나는 Datatable1 = datatable2.Clone (); 이제 작동 중입니다 ... 감사합니다 :-)
Developer404 2010-01-23

나는 이것을 행 배열로 시도했지만 작동하지 않았습니다. 행 배열의 각 행에 대해 새 행을 만들고 원래 행에서 ItemArray 속성을 복사 한 다음 추가가 작동했습니다.
Steve

1
이것은 게시 된 샘플을 사용하거나 dstata.tables [0]에서 "dt"가 복제 된 .NET Framework 4.0에서는 작동하지 않는 것 같습니다. @joe의 대답은 내 목적을 위해 작동했습니다. 복제 불가 버전 오류 : " Input array is longer than the number of columns in this table.". With-Clone 버전 오류 : " Unable to cast object of type 'System.Data.DataRow' to type 'System.IConvertible'.Couldn't store <System.Data.DataRow> in StoreOrder Column. Expected type is Int64."참고 : StoreOrder은 테이블 스키마의 첫 번째 열입니다. 전체 데이터 행을 첫 번째 열에 끼 우려 고하는 것 같습니다
Brian Webster

11

또 다른 방법은 DataView를 사용하는 것입니다.

// Create a DataTable
DataTable table = new DataTable()
...

// Filter and Sort expressions
string expression = "[Birth Year] >= 1983"; 
string sortOrder = "[Birth Year] ASC";

// Create a DataView using the table as its source and the filter and sort expressions
DataView dv = new DataView(table, expression, sortOrder, DataViewRowState.CurrentRows);

// Convert the DataView to a DataTable
DataTable new_table = dv.ToTable("NewTableName");

9

간단한 방법은 다음과 같습니다.

// dtData is DataTable that contain data
DataTable dt = dtData.Select("Condition=1").CopyToDataTable();

// or existing typed DataTable dt
dt.Merge(dtData.Select("Condition=1").CopyToDataTable());

5
DataTable dt = new DataTable();
foreach (DataRow dr in drResults)
{ 
    dt.ImportRow(dr);
}   


4
DataTable Assetdaterow =
    (
        from s in dtResourceTable.AsEnumerable()
        where s.Field<DateTime>("Date") == Convert.ToDateTime(AssetDate)
        select s
    ).CopyToDataTable();

3

.Net 3.5+ 추가 DataTableExtensions, DataTableExtensions.CopyToDataTable 메서드 사용

datarow 배열의 경우 .CopyToDataTable ()을 사용하면 datatable을 반환합니다.

단일 데이터 행 사용

new DataRow[] { myDataRow }.CopyToDataTable()

2

여기에 해결책이 있습니다. 잘 작동합니다.

DataTable dt = new DataTable();
dt = dsData.Tables[0].Clone();
DataRows[] drResults = dsData.Tables[0].Select("ColName = 'criteria');

foreach(DataRow dr in drResults)
{
    object[] row = dr.ItemArray;
    dt.Rows.Add(row);
} 

1

누구나 VB.NET에서 필요로하는 경우 :

Dim dataRow as DataRow
Dim yourNewDataTable as new datatable
For Each dataRow In yourArray
     yourNewDataTable.ImportRow(dataRow)
Next

1

다음과 같이 System.Linq를 사용할 수 있습니다.

if (dataRows != null && dataRows.Length > 0)
{
   dataTable = dataRows.AsEnumerable().CopyToDataTable();
}

1

먼저 데이터 테이블의 구조를 복제 한 다음 for 루프를 사용하여 행을 가져와야합니다.

DataTable dataTable =dtExisting.Clone();
foreach (DataRow row in rowArray) {
   dataTable.ImportRow(row);
}

0
DataTable dataTable = new DataTable();
dataTable = OldDataTable.Tables[0].Clone();
foreach(DataRow dr in RowData.Tables[0].Rows)
{
 DataRow AddNewRow = dataTable.AddNewRow();
 AddNewRow.ItemArray = dr.ItemArray;
 dataTable.Rows.Add(AddNewRow);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.