# 데이터 추가

아래와 같은 표와 매칭되는 DataTable을 만들어 보겠습니다.

Name Age Address
Kim 21 Seoul
Lee 22 Busan
Choi 20 Daegu
Yeu 25 Daegu
Son 22 Seoul
Yang 22 KwangJu

아래 예제는 위의 표를 DataTable을 생성하는 예제 입니다. Column을 추가 할 때 데이터 타입을 지정할 수 있으며, 행을 추가 할 경우 데이터 열의 갯수만큼 데이터를 삽입해야 합니다.

// 1. DataTable 생성
DataTable studentTable = new DataTable("Fruits");

// 2. 열(Column) 추가
studentTable.Columns.Add("Name", typeof(string));
studentTable.Columns.Add("Age", typeof(int));
studentTable.Columns.Add("Address", typeof(string));

// 3. 행(Row) 추가
studentTable.Rows.Add("Kim",21,"Seoul");
studentTable.Rows.Add("Lee",22,"Busan");
studentTable.Rows.Add("Choi",20,"Daegu");
studentTable.Rows.Add("Yeu",25,"Daegu");
studentTable.Rows.Add("Son",22,"Seoul");
studentTable.Rows.Add("Yang",22,"KwangJu");

아래는 MSDN에 있는 DataTable Sample Code인데 여기를 자세히 살펴 보면 Column에 추가 속성을 지정하는 모습을 볼 수 있습니다. Unique 속성을 통해 중복된 데이터 입력이 불가능하게 하거나, ReadOnly 속성을 통해 읽기만 가능하게 할 수도 있습니다.

마지막으로 DB의 Table처럼 Primary Key를 지정할 수도 있습니다.

//https://learn.microsoft.com/ko-kr/dotnet/api/system.data.datatable?view=net-8.0

// Create a new DataTable.
System.Data.DataTable table = new DataTable("ParentTable");
// Declare variables for DataColumn and DataRow objects.
DataColumn column;
DataRow row;

// Create new DataColumn, set DataType,
// ColumnName and add to DataTable.
column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.ColumnName = "id";
column.ReadOnly = true;
column.Unique = true;
// Add the Column to the DataColumnCollection.
table.Columns.Add(column);

// Create second column.
column = new DataColumn();
column.DataType = System.Type.GetType("System.String");
column.ColumnName = "ParentItem";
column.AutoIncrement = false;
column.Caption = "ParentItem";
column.ReadOnly = false;
column.Unique = false;
// Add the column to the table.
table.Columns.Add(column);

// Make the ID column the primary key column.
DataColumn[] PrimaryKeyColumns = new DataColumn[1];
PrimaryKeyColumns[0] = table.Columns["id"];
table.PrimaryKey = PrimaryKeyColumns;

# 데이터 탐색

DataTable 내에 있는 데이터는 foreach 구문을 이용하여 탐색할 수 있습니다. DataTable내의 각 행의 데이터는 DataRow라는 클래스로 맵핑되며, Column의 이름을 통해 데이터에 접근이 가능합니다.

 
// 4. 전체 데이터 출력
Console.WriteLine("<< Student List >> ");
foreach (DataRow row in studentTable.Rows)
{
      Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
}

# 데이터 필터링

DataTable내의 있는 데이터는 마치 DB의 Query문처럼 특정 조건이 만족되는 데이터만 별도로 뽑아 올 수 있습니다.DataTable 클래스의 Select()함수를 이용하여 특정 연령만 뽑아오거나 데이터를 정렬 할 수도 있습니다.

// 5. 특정 연령 필터링
string filterExpression = "Age = 22";
DataRow[] filteredRows = studentTable.Select(filterExpression);
Console.WriteLine(" \n << Student List (Age = 22) >> ");
foreach (DataRow row in filteredRows)
{
      Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
}

// 6. 특정 이름 필터링
filterExpression = "Name = 'Lee'";
filteredRows = studentTable.Select(filterExpression);
Console.WriteLine(" \n << Student List (Name = Lee) >> ");
foreach (DataRow row in filteredRows)
{
      Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
}


// 7. 나이를 기준으로 오름차순 정렬
string sortExpression = "Age ASC";
DataRow[] sortedRows = studentTable.Select("", sortExpression);
Console.WriteLine(" \n << Student Sorted List (Age) >> ");
foreach (DataRow row in sortedRows)
{
      Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
}

# 데이터 수정

이름이 Lee인 사람의 나이를 수정해보겠습니다. DataTable를 탐색하면서 이름이 ‘Lee’인 사람을 찾고 바로 데이터를 수정하면 됩니다.

//8. DataTable 수정
Console.WriteLine("\nUpdated Student List: Lee's age 22 -> 32");
foreach (DataRow row in studentTable.Rows)
{
      if (row["Name"].ToString() == "Lee")
         row["Age"] = 32;
}

// 전체 데이터 출력
Console.WriteLine("<< Student List >> ");
foreach (DataRow row in studentTable.Rows)
{
      Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
}           

# 데이터 삭제

DataTable에서 데이터를 삭제할 때는 데이터를 수정하는 부분과 비슷하지만 주의할 점이 있습니다. foreach 구문에서 바로 DataTable의 Row를 삭제하는 함수를 호출하면 “컬렉션이 수정되었습니다. 열거 작업이 실행되지 않을 수 있습니다.”과 같은 Exception이 발생하기 때문입니다.

따라서 foreach 구문에서는 삭제할 행을 따로 보관하고, foreach 구문이 끝난 뒤 제거해야 됩니다.

//9. DataTable 내의 데이터 삭제
Console.WriteLine("\n Deleted Student List: Lee");
DataRow targetRow = null;
foreach (DataRow row in studentTable.Rows)
{
   if (row["Name"].ToString() == "Lee")
   {
      //Error 발생
      //System.InvalidOperationException: '컬렉션이 수정되었습니다. 열거 작업이 실행되지 않을 수 있습니다.'
      //
      //studentTable.Rows.Remove(row);
      targetRow = row;
   }
}

//foreach 구문 끝나고 Row를 삭제 할 것
studentTable.Rows.Remove(targetRow);

// 전체 데이터 출력
Console.WriteLine("<< Student List >> ");
foreach (DataRow row in studentTable.Rows)
{
   Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
}
Console.WriteLine();

# 전체 샘플 코드

using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleAppTest
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 1. DataTable 생성
            DataTable studentTable = new DataTable("Fruits");

            // 2. 열(Column) 추가
            studentTable.Columns.Add("Name", typeof(string));
            studentTable.Columns.Add("Age", typeof(int));
            studentTable.Columns.Add("Address", typeof(string));


            // 3. 행(Row) 추가
            studentTable.Rows.Add("Kim",21,"Seoul");
            studentTable.Rows.Add("Lee",22,"Busan");
            studentTable.Rows.Add("Choi",20,"Daegu");
            studentTable.Rows.Add("Yeu",25,"Daegu");
            studentTable.Rows.Add("Son",22,"Seoul");
            studentTable.Rows.Add("Yang",22,"KwangJu");

            // 4. 전체 데이터 출력
            Console.WriteLine("<< Student List >> ");
            foreach (DataRow row in studentTable.Rows)
            {
                Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
            }

            // 5. 특정 연령 필터링
            string filterExpression = "Age = 22";
            DataRow[] filteredRows = studentTable.Select(filterExpression);
            Console.WriteLine(" \n << Student List (Age = 22) >> ");
            foreach (DataRow row in filteredRows)
            {
                Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
            }

            // 6. 특정 이름 필터링
            filterExpression = "Name = 'Lee'";
            filteredRows = studentTable.Select(filterExpression);
            Console.WriteLine(" \n << Student List (Name = Lee) >> ");
            foreach (DataRow row in filteredRows)
            {
                Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
            }

            // 7. 가격을 기준으로 오름차순 정렬
            string sortExpression = "Age ASC";
            DataRow[] sortedRows = studentTable.Select("", sortExpression);
            Console.WriteLine(" \n << Student Sorted List (Age) >> ");
            foreach (DataRow row in sortedRows)
            {
                Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
            }

            //8. DataTable 수정
            Console.WriteLine("\nUpdated Student List: Lee's age 22 -> 32");
            foreach (DataRow row in studentTable.Rows)
            {
                if (row["Name"].ToString() == "Lee")
                    row["Age"] = 32;
            }

            // 전체 데이터 출력
            Console.WriteLine("<< Student List >> ");
            foreach (DataRow row in studentTable.Rows)
            {
                Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
            }


            //9. DataTable 내의 데이터 삭제
            Console.WriteLine("\n Deleted Student List: Lee");
            DataRow targetRow = null;
            foreach (DataRow row in studentTable.Rows)
            {
                if (row["Name"].ToString() == "Lee")
                {
                    //Error 발생
                    //System.InvalidOperationException: '컬렉션이 수정되었습니다. 열거 작업이 실행되지 않을 수 있습니다.'
                    //
                    //studentTable.Rows.Remove(row);
                    targetRow = row;
                }
            }

            studentTable.Rows.Remove(targetRow);

            // 전체 데이터 출력
            Console.WriteLine("<< Student List >> ");
            foreach (DataRow row in studentTable.Rows)
            {
                Console.WriteLine($"Name: {row["Name"]} Age: {row["Age"]}  Address: {row["Address"]}");
            }
            Console.WriteLine();
        }
    }
}

Tags:

Categories:

Updated:

Leave a comment