38. [ADO.NET] DataTable 생성과 테이블 구조 설계

ADO.NET에서는 논리적인 데이터 집합을 디자인하고 데이터를 관리할 수 있는 DataTable 클래스를 제공하고 있습니다. DataTable은 DataSet을 구성하는 주요 개체로 프로그램 메모리 상의 한 개의 테이블입니다.

여기에서는 DataTable 개체를 생성하여 테이블을 설계하고 해당 개체를 이용하여 데이터를 관리하는 방법을 살펴볼게요.

▷클래스 상속 계층

System.Object

System.ComponentModel.MarshalByValueComponent

System.Data.DataTable

DataTable은 개체를 생성한 후에 테이블의 구조를 설계한 후에 사용합니다. 테이블의 구조를 설계한다는 것은 열을 추가하는 것과 기타 테이블 속성을 설정하는 것을 말합니다.

DataTable 클래스에서는 public 액세스 지정으로 설정한 세 가지 생성자를 제공합니다.

publid DataTable ( );
publid DataTable (string table_name);
publid DataTable (string table_name, string namespace);

DataTable을 생성한 이후에 구조 설계할 때는 DataColumn 개체를 생성하여 DataTable 개체에 추가하는 형태로 진행합니다.

DataColumn

DataColumn 클래스는 DataTable의 구조를 정의할 때 사용하는 열의 스키마입니다.

DataColumn 클래스에서 제공하는 생성자는 다음과 같습니다.

public DataColumn ( );
public DataColumn ( string col_name);
public DataColumn ( string col_name, Type data_type);
public DataColumn ( string col_name, Type data_type, string expr); 
public DataColumn ( string col_name, Type data_type, string expr, MappingType type);
//expr 열 생성 사용식

DataColumn 클래스에 제공하는 주요 속성은 다음과 같습니다.

속성가져오기/설정하기설명
AllowDBNull가져오기/설정하기null 허용 여부
AutoIncrement가져오기/설정하기열 값이 자동으로 증가 여부
AutoIncrementSeed가져오기/설정하기AutoIncrement 속성이 true 일 때열의 시작 값 (기본값은 0)
AutoIncrementStep가져오기/설정하기AutoIncrement 속성이 true 일 때열 값의 증가하는 폭
ColumnName가져오기/설정하기열의 이름
DataType가져오기/설정하기열의 데이터 형식
DefaultValue가져오기/설정하기기본 값
Unique가져오기/설정하기각 행에 있는 값이 고유해야 하는지 여부

이제 DataTable 개체를 생성하고 테이블 구조를 설계하는 예제 코드를 작성해 봅시다.

먼저 DataTable 개체를 생성합니다.

DataTable dt = new DataTable("Books");

DataColumn 개체를 생성하고 속성을 설정한 후에 DataTable 개체의 Columns 컬렉션 속성에 추가합니다.

DataColumn dc_title = new DataColumn();
dc_title.ColumnName = "Title";
dc_title.DataType = typeof(string);
dc_title.AllowDBNull = false;
dt.Columns.Add(dc_title);

만약 DataTable에 주요 키를 설정하려면 DataTable 개체의 PrimaryKey 속성에 주요 키로 사용할 컬럼 배열로 설정합니다.

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

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

static void Main(string[] args)
{
    DataTable dt = new DataTable("Books");
    DesingTable(dt);
    ViewAll(dt);
}
private static void DesingTable(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)
{
    Console.WriteLine("테이블 명: {0}", dt.TableName);
    Console.WriteLine("컬럼 개수: {0}", dt.Columns.Count);
    foreach (DataColumn dc in dt.Columns)
    {
        Console.WriteLine("{0}:{1}", dc.ColumnName,dc.DataType);
    }
}

실행 결과

테이블 명: Books
컬럼 개수:4
Title:System.String
ISBN:System.String
Author:System.String
Price:System.Int32