C#

[C#] DataTable 두개를 Merge 하기. (합치기)

C#Developer 2021. 7. 12. 16:03

안녕하세요. 회원여러분.
오늘은 C# DataTable의 Merge에 대해 알아보도록 하겠습니다.

    Merge : [동사] 합병[병합]하다, 합치다
위 뜻처럼 두개의 DataTable 중 하나의 DataTable 기준으로 두 DataTable를 
합치는 함수입니다.

DataTable의 데이터를 가공 중 분산되어 DataTable을 하나의 DataTable로 
합칠 때 사용할 수 있습니다.

※ DataTable의 Join함수는 DataTable간의 특정 칼럼값을 비교하여 데이터 행의 연결을 하는 함수며,
  Merge함수는 DataTable간의 데이터를 하나의 DataTable로 합치는 것 입니다.

 

        /// <summary>
        /// 데이터테이블 합치는 함수.
        /// </summary>
        /// <param name="_mainDataTable">메인 데이터테이블. 이 테이블의 칼럼명을 기준으로 합쳐진다.</param>
        /// <param name="_secondDataTable">합칠 데이터테이블. 메인 데이터테이블 칼럼명으로 합쳐진다.</param>
        /// <returns></returns>
        private DataTable SetDataTableMerge(DataTable _mainDataTable, DataTable _secondDataTable)
        {
            DataTable _newDataTable = new DataTable();
            bool ColumnDataTypeError = false;

            //칼럼수가 다르면
            if (_mainDataTable.Columns.Count != _secondDataTable.Columns.Count)
            {
                _mainDataTable.Merge(_secondDataTable);
            }
            //칼럼수가 같다면.
            else
            {
                //메인 데이터테이블의 칼럼명과 합칠 데이터테이블의 칼럼명을 같게 한다.
                for (int i = 0; i < _mainDataTable.Columns.Count; i++)
                {
                    _secondDataTable.Columns[i].ColumnName = _mainDataTable.Columns[i].ColumnName;

                    //만약 두 테이블 칼럼 데이터타입가 하나라도 다르면
                    if (_secondDataTable.Columns[i].DataType != _mainDataTable.Columns[i].DataType)
                    {
                        ColumnDataTypeError = true;
                    }
                }

                //칼럼의 데이터타입이 다르다면
                if (ColumnDataTypeError)
                {
                    for (int i = 0; i < _mainDataTable.Columns.Count; i++)
                    {
                        _newDataTable.Columns.Add(_mainDataTable.Columns[i].ColumnName, _mainDataTable.Columns[i].DataType);
                    }

                    for (int i = 0; i < _secondDataTable.Rows.Count; i++)
                    {
                        DataRow dr = _newDataTable.NewRow();

                        for (int j = 0; j < _secondDataTable.Columns.Count; j++)
                        {
                            dr[_newDataTable.Columns[j].ColumnName] = _secondDataTable.Rows[i][_newDataTable.Columns[j].ColumnName];
                        }

                        _newDataTable.Rows.Add(dr);
                    }

                    _mainDataTable.Merge(_newDataTable);
                }
                //칼럼의 데이터타입이 같다면
                else
                {
                    _mainDataTable.Merge(_secondDataTable);
                }
            }

            return _mainDataTable;
        }

 

Merge를 사용 시 주의해야 될 것은 DataTable간 구조(칼럼명, 칼럼 수, 데이터형식)가 같아야 합니다.

위 함수는 칼럼명, 칼럼 수, 데이터형식의 다름에 따른 오류를 줄이기 위해 조건문을 사용한 것 입니다.

 

DataTableTest.zip
0.07MB

 

위 함수를 사용한 샘플소스를 참고하시기 바랍니다. 

 

이상 사이버지식정보장이었습니다.