여러 DataTable을 단일 DataTable로 결합
SQL Server에서 데이터 작업을 할 때 여러 테이블의 데이터를 하나의 DataTable로 결합해야 하는 경우가 있습니다. 단일 통합 데이터 세트. 이는 다른 테이블의 행을 대상 테이블에 추가할 수 있는 병합 작업을 사용하여 수행할 수 있습니다. 그러나 테이블의 열 구조가 다른 경우 병합된 결과 테이블에 데이터가 채워지거나 잘못 정렬될 수 있습니다.
기존 솔루션 및 제한 사항
제공되는 솔루션은 이를 해결하려고 시도합니다. 다양한 열 구조를 가진 여러 알 수 없는 테이블의 DataTable을 결합하기 위해 병합 루프를 사용하여 문제를 해결합니다. 이 방법은 효과가 있지만 지루할 수 있으며 데이터 정렬이 잘못될 수 있습니다.
LINQ를 사용한 대체 접근 방식
이러한 제한을 극복하려면 LINQ(Language 통합 쿼리)는 사용 가능:
public static DataTable MergeAll(this IList<DataTable> tables, String primaryKeyColumn) { if (!tables.Any()) throw new ArgumentException("Tables must not be empty", "tables"); if(primaryKeyColumn != null) foreach(DataTable t in tables) if(!t.Columns.Contains(primaryKeyColumn)) throw new ArgumentException("All tables must have the specified primarykey column " + primaryKeyColumn, "primaryKeyColumn"); if(tables.Count == 1) return tables[0]; DataTable table = new DataTable("TblUnion"); table.BeginLoadData(); // Turns off notifications, index maintenance, and constraints while loading data foreach (DataTable t in tables) { table.Merge(t); // same as table.Merge(t, false, MissingSchemaAction.Add); } table.EndLoadData(); if (primaryKeyColumn != null) { // since we might have no real primary keys defined, the rows now might have repeating fields // so now we're going to "join" these rows ... var pkGroups = table.AsEnumerable() .GroupBy(r => r[primaryKeyColumn]); var dupGroups = pkGroups.Where(g => g.Count() > 1); foreach (var grpDup in dupGroups) { // use first row and modify it DataRow firstRow = grpDup.First(); foreach (DataColumn c in table.Columns) { if (firstRow.IsNull(c)) { DataRow firstNotNullRow = grpDup.Skip(1).FirstOrDefault(r => !r.IsNull(c)); if (firstNotNullRow != null) firstRow[c] = firstNotNullRow[c]; } } // remove all but first row var rowsToRemove = grpDup.Skip(1); foreach(DataRow rowToRemove in rowsToRemove) table.Rows.Remove(rowToRemove); } } return table; }
사용법
MergeAll 메서드를 사용하려면 DataTable 목록을 전달하고 선택적으로 공통 기본 키 열 이름을 지정합니다.
var tables = new[] { tblA, tblB, tblC }; DataTable TblUnion = tables.MergeAll("c1");
LINQ의 장점 접근 방식
참고: 이 솔루션을 사용하려면 모든 테이블에 지정된 경우 기본 키에 대한 고유한 열 이름이 있어야 합니다.
위 내용은 SQL Server에서 다양한 열 구조를 사용하여 여러 DataTable을 효율적으로 병합하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!