39. [ADO.NET] DataTable에 행 추가

이번에는 DataTable 개체에 행을 추가하는 방법을 알아봅시다.

DataTable 클래스에는 Rows 컬렉션 속성을 제공하고 있으며 추가한 Row 개체를 보관하는 컬렉션입니다. 따라서 DataTable 개체에 행을 추가할 때는 Row 클래스를 이용합니다.

그런데, Row 개체는 DataTable 개체에 설계한 구조에 맞아야 하기 때문에 직접 생성할 수 없고 DataTable 개체의 NewRow 메서드를 이용하여 설계한 구조에 맞는 Row 개체를 생성합니다.

DataRow dr = dt.NewRow();

그리고 DataRow 개체에 열마다 원하는 값을 지정합니다.

dr["ISBN"] = isbn;
dr["Title"] = title;
dr["Author"] = author;
dr["Price"] = price;

주의할 점은 DataRow 개체를 DataTable 개체의 Rows 컬렉션 속성에 추가해야 합니다. 이 때 테이블 스키마에 위배가 발생하면 예외를 발생합니다.

dt.Rows.Add(dr);

다음은 실습한 소스 코드입니다.

static void Main(string[] args)
{
    DataTable dt = new DataTable("Books");
    DesignTable(dt); 
    AddBooks(dt, "111-11-1111-111-1", "ADO.NET", "홍길동", 12000);
    AddBooks(dt, "111-11-1111-111-2", "XML.NET", "홍길동", 15000);
    ViewAll(dt);
}
private static void AddBooks(DataTable dt, string isbn, string title, string author, int price)
{
    try
    {
        DataRow dr = dt.NewRow();
        dr["ISBN"] = isbn;
        dr["Title"] = title;
        dr["Author"] = author;
        dr["Price"] = price;
        dt.Rows.Add(dr); 
    }
    catch (Exception e)
    {
        Console.WriteLine("{0} 추가 실패", title);
        Console.WriteLine("이유:{0}", e.Message);
    }
}
private static void DesignTable(DataTable dt)
{
    DataColumn dc_title = new DataColumn();
    dc_title.ColumnName = "Title";
    dc_title.DataType = typeof(string);
    dc_title.AllowDBNull = false;
    dt.Columns.Add(dc_title);

    DataColumn dc_isbn = new DataColumn("ISBN", typeof(string));
    dc_isbn.Unique = true;
    dc_isbn.AllowDBNull = false;
    dt.Columns.Add(dc_isbn);
    DataColumn dc_author = new DataColumn();
    dc_author.ColumnName = "Author";
    dc_author.DataType = typeof(string);
    dc_author.AllowDBNull = false;
    dt.Columns.Add(dc_author);

    DataColumn dc_price = new DataColumn();
    dc_price.ColumnName = "Price";
    dc_price.DataType = typeof(int);
    dc_price.AllowDBNull = false;
    dt.Columns.Add(dc_price);

    DataColumn[] pkeys = new DataColumn[1];
    pkeys[0] = dc_isbn;
    dt.PrimaryKey = pkeys;
}

private static void ViewAll(DataTable dt)
{ 
    int row_count = dt.Rows.Count;
    Console.WriteLine("테이블 명: {0}", dt.TableName);
    Console.WriteLine("행 개수:{0}", row_count);

    DataRow dr = null;
    for(int i = 0;i<row_count;i++)
    {
        dr = dt.Rows[i];
        foreach (DataColumn dc in dt.Columns)
        {
            Console.WriteLine("{0}:{1}", dc.ColumnName, dr[dc]);
        }
        Console.WriteLine("-------------------------------------");
    }
}