C# – DataTable활용

C# 에서 제공하는 자료 구조가 많이 있지만 저는 DataTable을 즐겨 사용합니다.
2차원 배열과 같은 구조로 되어 있고 실제 DB Query 의 결과값을 Tool 에서 보는 것과 동일한 형태로 값을 가지고 있습니다.

DataTable을 컨트롤에 직접 바인딩할 수도 있고 배열처럼 반복하면서 출력할 수도 있어서 상황에 따라 다양하게 이용하게 됩니다.

프로젝트를 진행하면서 유용하였던 몇 가지 DataTable 활용 방법을 정리해 보았습니다.

1. DataTable의 내용을 다시 Query하여 그 결과를 DataTable로 대입하는 방법
간혹 Query 결과를 가지고 있는 DataTable을 어떤 조건으로 다시 필터링하거나 결과를 한정하여야 하는 경우가 생기게 됩니다. 물론 SQL 문이나 Procedure를 작성하여 분리할 수 있지만 번거로운 것이 사실입니다. 이때 DataTable에 람다 식을 사용하여 Query할 수 있습니다. 그 결과를 DataTable에 대입하여 다시 사용할 수 있습니다.

DataTable contactType = ContactSetting.AsEnumerable().Where(i => i.Field<String>(“contact_check_yn”) == “Y”).CopyToDataTable();

 

위의 예는 ContactSetting DataTable의 내용 중 contact_check_yn 필드의 값이 ‘Y’인 것만을 추출하여 contactType DataTable에 대입하는 구문입니다. 이런식으로 사용하여 DataTable의 내용을 별도의 DB 연결 없이 필터링하여 값을 한정할 수 있습니다.

2. DataTable의 내용 중 특정한 조건으로 필터링한 값이 있는지 판단하는 방법
DataTable 내용 중 특정한 조건의 값이 존재하는지 판단할 수 있습니다. 물론 반복문으로 특정한 필드의 값을 비교하여 판단할 수 있지만 위의 방법과 비슷하게 추출할 수 있습니다.

DataTable respondent = getRespondentDetailInfo(listNo);
var respondentEditItemRows = respondent.AsEnumerable().Where(i => i.Field<String>(“list_edit_yn”) == “Y”);if (respondentEditItemRows.Any() == false)
{
pnlRespodentEditButton.Visible = false;
}

 

위의 예는 respondent DataTable 내의 list_edit_yn 필드의 값이 ‘Y’인 행이 존재하는지 여부를 판단하는 코드 입니다. Query한 결과를 Any() 메소드로 값이 존재하는지 판단하여 그 후속 작업을 진행하는 코드 입니다.

3. DataTable내의 특정한 Row 삭제
여러가지 이유로 DataTable내의 특정한 Row를 삭제하여야 하는 경우가 있습니다. DataTable에서 값을 유일하게 구별할 수 있는 Primary key 필드를 필터링하여 삭제하는 방법입니다.

int labelSeq = Convert.ToInt32(option.columnScreenFilter.Items[i].Value);var deleteRow = columnLabelList.AsEnumerable().Where(x => x.Field<Int32>(“label_seq”) == labelSeq).Cast<DataRow>().FirstOrDefault();
columnLabelList.Rows.Remove(deleteRow);

 

1번의 예와 같이 비슷하게 columnLabelList DataTalbe의 label_seq 필드의 값이 labelSeq 변수의 값과 동일한 Row를 추출하고 그 Row를 DataTable에서 삭제하는 방법입니다.

4. DataTable을 대상으로 배열에 존재하는 값에 해당하는 Row만 가져와서 DataTable로 반환하는 방법
1번의 예와 비슷하다고 할 수 있는데 특정한 값이 아니라 배열내에 존재하는 값을 대상으로 한다는 것이 다릅니다.

string[] topBannerItemResponseValue = new string[10];for (var j = 0; j < topBannerItemResponseValue.Length; j++) { topBannerItemResponseValue[j] = Convert.ToInt32(topBannerLabelListResult.Rows[j][“response_value”]).ToString(); }

DataTable topBannerLabelListNew = topBannerLabelList.AsEnumerable().Where(x => topBannerItemResponseValue.Contains(x.Field<String>(“label_values”))).CopyToDataTable();

 

string 배열 변수 topBannerItemResponseValue에 추출하고자 하는 값을 대입합니다. topBannerLabelList DataTable의 label_values 값을 대상으로 배열변수내의 값과 같은 결과를 Query하여 topBannerLabelListNew DataTable에 대입하는 코드 입니다.

5. DataTable을 특정한 필드로 정렬
DB를 Query하여 가져온 결과를 다른 필드의 값을 기준으로 정렬하여야 하는 경우가 있습니다.

DataTable banner = getBanner();DataView dv = banner.DefaultView; dv.Sort = “sort_order”;

banner = dv.ToTable();

 

banner DataTable 내의 sort_order 필드로 정렬하여 그 결과를 다시 banner DataTable에 대입하는 코드 입니다.

DataTable을 이용하시는데 도움이 되었으면 좋겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Time limit is exhausted. Please reload the CAPTCHA.