10/30 DataTable

정수현·2024년 10월 30일
post-thumbnail

DataTable

  • 메모리 상의 한 개의 테이블
  • 데이터 테이블 개체 생성 후 테이블의 구조를 설계 (칼럼 추가 등 기타 속성을 설정)

1. 데이터 테이블 객체 생성

  • DataTable : 데이터 테이블 객체
  • DataTable 뒤에 테이블 명을 명시한다.

[ 파일명 : MemoryDB.cs ]

public void MakeAccountTable()
{
	DataTable accountTable = new DataTable("Account");    
}

1-2 칼럼 생성

  • DataColumn : 칼럼 객체

예시

public void MakeAccountTable()
{
    DataColumn dc_id = new DataColumn("accId", typeof(int));

	dc_id.AutoIncrement = true;
	dc_id.AucoIncrementSeed = 1;
	dc_id.AutoIncrementStep = 1;
	
	accountTable.Columns.Add(dc_id);
}
  • accId는 생성할 칼럼의 이름이다. 뒤에 칼럼의 타입을 명시한다.

  • 칼럼 객체를 만들어 dc_id 변수에 저장한다.

  • AutoIncrement
    : 숫자 자동 증가를 설정한다.

  • AutoIncrementSeed
    : 시작 숫자의 기본 값을 정한다. 위 코드에서는 1로 설정하였고, 따로 설정하지 않으면 0으로 기본값이 설정된다.

  • AutoIncrementStep
    : 증감의 폭을 설정한다. 위 코드에서는 증감 폭을 1로 설정하였다.

  • accountTable.Columns.Add(dc_id)
    : 앞에서 설계한 구조를 바탕으로 데이터 테이블을 생성한다.

  • 위와 같은 방식으로 칼럼을 여러 개 지정할 수 있다.

  • accId : 아이디, 고유키, int타입
    accNumber : 계좌번호, Unique 속성, int 타입
    accName : 이름, string 타입
    accBalance : 잔액, int 타입
    accDate : 계좌 개설일, DateTime 타입


1-3 칼럼의 고유키 설정

  • 데이터 테이블 개체의 PrimaryKey 속성에 고유 키로 사용할 칼럼 배열을 설정한다.
DataColumn [] PK = new DataColumn[1];
PK[0] = dc_id;
accountTable.PrimaryKey = PK;
  • new DataColumn[1]
    : DataColumn 객체를 저장할 배열
    기본 키가 하나의 열로 설정되므로 배열의 크기는 1이다.

  • 고유키로 지정할 칼럼 dc_id를 배열의 첫 번째 요소에 할당한다.

  • 데이터 테이블의 PrimaryKey 속성에 PK 배열을 할당하여, 지정한 열(dc_id)을 고유키로 설정한다.


2. 로우데이터 생성

  • DataRow 객체를 생성하여, 개체의 열마다 원하는 값을 넣는다.
public bool AccountInsert(int number, string name, int balance, DateTime dt)
{
	DataRow dr = accountTable.NewRow();
	dr[1] = number;
	dr[2] = name;
	dr[3] = balance;
	dr[4] = dt;
    
    accountTable.Rows.Add(dr);
    
    return true;
}
  • 첫번째 요소인 dr[0]AutoIncrement이기 때문에 직접 열을 추가할 필요는 없다.

  • 각 요소에 차례로 미리 지정한 칼럼에 해당하는 항목을 설정하면 된다.

  • Add 메서드를 통해 완성된 열을 생성한다.


3. 테이블의 정보 출력

[ 파일명 : Form1.cs ]

private MemoryDB _db = new MemoryDB();

private void AccountTableView()
{
	DataTable dt = _db.AccountTable;
    textBox1.AppendText(string.Format($"테이블명 : {dt.TableName}\r\n"));
	textBox1.AppendText("---------------------------------------------\r\n");
	textBox1.AppendText(string.Format($"PK : {dt.PrimaryKey[0].ColumnName}\r\n"));
	textBox1.AppendText(string.Format($"칼럼 : {dt.Columns.Count}개\r\n"));
	textBox1.AppendText(string.Format($"로우데이터 : {dt.Rows.Count}개\r\n"));
	textBox1.AppendText("---------------------------------------------\r\n");

	foreach(DataColumn col in dt.Columns)
	{
    	string temp = string.Format($"{col.ColumnName}\t{col.DataType}\t{col.AllowDBNull}");
    	textBox1.AppendText(temp+"\r\n");
	}
}
  • 위에서 생성한 데이터 테이블의 정보를 출력하는 코드이다.

  • 테이블명, 고유키, 칼럼 수, 로우데이터 수와 "칼럼 명 + 타입 + null 여부"를 출력한다.

  • PrimaryKey[0].ColumnName : 고유키
  • Columns.Count : 칼럼 개수
  • Rows.Count : 로우데이터 개수



XML

테이블 로우데이터 저장

  • 데이터 테이블을 저장하고 불러올 때 WriteXml()ReadXml() 메서드를 활용할 수 있다.

  • WriteXml : 테이블의 로우데이터를 저장한다.

  • ReadXml : 테이블의 로우데이터를 가져온다.

[ 파일명 : MyXml.cs ]

//XML 저장
public static bool WriteAccount(DataTable dt)
{
	dt.WriteXml(AccountXmlFileName);
	return true;
}
//XML 불러오기
public static bool ReadAccount(DataTable dt)
{
    if (File.Exists(AccountXmlFileName) == true)
    {
        dt.ReadXml(AccountXmlFileName);
    }
    return true;
}

테이블 구조 저장

  • 스키마 정보를 저장하여 테이블의 구조를 출력할 수 있다.

  • WriteXmlSchema : 테이블의 구조를 저장한다.

  • ReadAccountSchema : 테이블의 구조를 가져온다.

//스키마 저장
public static bool WriteAccountSchema(DataTable dt)
{
    dt.WriteXmlSchema(AccountSchemaXmlFileName);
    return true;
}
//스키마 불러오기
public static bool ReadAccountSchema(DataTable dt)
{
    if (File.Exists(AccountSchemaXmlFileName) == true)
        dt.ReadXmlSchema(AccountSchemaXmlFileName);
    return true;
}

0개의 댓글