본문 바로가기
개발/Unity 내일배움캠프 TIL

C# DataTable 간단 사용법

by 석시 2023. 8. 22.



C#의 DataTable은 데이터베이스 테이블 형태의 테이블을 C#에서도 사용할 수 있도록 해놓은 것이다.

사용법은 데이터베이스와 똑같을테지만… 아쉽게도 아무 데이터베이스도 경험이 없는 나에게는 헷갈리는 것이 많아 이번에 정리를 해보고자 한다.

DataTable 생성

using System.Data;

DataTable Table = new DataTable();

컬럼 정의

Table.Columns.Add("Code", typeof(int));
Table.Columns.Add("Type", typeof(ItemType));
Table.Columns.Add("Name", typeof(string));
Table.Columns.Add("Grade", typeof(ItemGrade));
Table.Columns.Add("Stat", typeof(string));
Table.Columns.Add("Gold", typeof(int));
Table.Columns.Add("Description", typeof(string));

DataColumn[] key = new DataColumn[1];
key[0] = Table.Columns[0];

DataTable.Columns[index]로 추가했던 Column에 접근이 가능하다.

인덱스는 0에서부터 시작해서 추가한 순서대로 Column이 들어간다.

로우 추가

Table.Rows.Add(new object[] { 0001, ItemType.ARMOR, "무쇠갑옷", ItemGrade.COMMON, 5, 300, "무쇠로 만들어져 튼튼한 갑옷입니다." });
Table.Rows.Add(new object[] { 0002, ItemType.WEAPON, "낡은 검", ItemGrade.COMMON, 2, 400, "쉽게 볼 수 있는 낡은 검입니다." });

컬럼을 추가했던 순서대로 속성을 배치한 object array를 생성해서 DataRow를 만들 수 있다.

DataRow dataRow = Table.NewRow();
dataRow["Code"] = 0001;
dataRow["Type"] = ItemType.ARMOR;
dataRow["Name"] = "무쇠갑옷";
dataRow["Grade"] = ItemGrade.COMMON;
dataRow["Stat"] = 5;
dataRow["Gold"] = 300;
dataRow["Description"] = "무쇠로 만들어져 튼튼한 갑옷입니다.";

Table.Rows.Add(dataRow);

기본 키(Primary Key)

기본 키(Primary Key)는 해당 키를 이용하여 테이블의 모든 행을 검색할 수 있도록 하는 키이다.

고유(unique)한 단일 열이나 열의 조합으로 구성할 수 있다.

기본 키 설정

DataColumn[] key = new DataColumn[1];
key[0] = Table.Columns[0];
Table.PrimaryKey = key;

데이터 추출

기본 키를 이용한 접근

DataRow? dataRow = Table.Rows.Find(itemCode);
if (dataRow == null) throw new DataMisalignedException();

int basicStat = Convert.ToInt32(itemData["Stat"]);

기본 키를 설정했으면 DataTable.Rows.Find() 함수에 해당하는 값을 넣어주면 일치하는 기본 키를 가진 Row를 통채로 반환해준다.

이 때 각 데이터는 모두 object 형태로 반환되기 때문에 ConvertToString()을 이용해 캐스팅을 한 번 거쳐줘야 사용할 수 있다.

인덱스를 이용한 접근

for (int i = 0; i < Table.Rows.Count; i++)
{
	ItemType itemType = (ItemType)Table.Rows[i]["Type"];
	string name = Table.Rows[i]["Name"].ToString();
}

인덱스를 이용해서도 접근이 가능하다.

인덱스는 역시 추가한 순서대로.

foreach를 이용한 접근

foreach(DataRow dataRow in Table.Rows)
{
	ItemType itemType = (ItemType)dataRow["Type"];
	string name = dataRow["Name"].ToString();
}


Uploaded by N2T