글쓴이 보관물: Toughman

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을 이용하시는데 도움이 되었으면 좋겠습니다.

베란다 빗물 누수 보수용으로 구입한 하우징실리콘

이사를 하고 나서 많지 않은 짐을 제자리에 정리하고 처음으로 비가 좀 많이 온 날 거실쪽 베란다 바닥에 물이 고여 있는 것을 보게 되었습니다.

처음에는 천장에서 물이 떨어지나 보았는데 그런 것은 아니었습니다.그렇다면 바닥쪽에서 들어온 것이라 생각하고 자세히 살펴보니 물이 조금씩 스며들어 흐른 흔적을 볼 수 있었습니다.

베란다 바닥

베란다 바닥

베란다의 모든 부분이 그런 것은 아니었고 물이 스며드는 지점이 있었습니다. 그래서 그 부분을 막으면 빗물이 들어오지 않을 것이라 생각하고 어떻게 하면 막을 수 있을까 생각해 보았습니다.

제일 먼저 생각한 것은 실리콘이라고 하는 것이었는데 냄새도 많이 나고 별도의 도구도 같이 구매를 해야 제대로 사용할 수 있어서 적은 부분에 사용하기에는 적합하지 않다고 생각하였습니다.

그래서 인터넷 쇼핑몰을 검색해 보니 눈에 띄는 제품이 있었습니다. 가격이 비싸다고 생각되지는 않았는데 짜서 시공 할 수 있는 점이 마음에 들어 구매하게 되었습니다. 용량이 적혀 있기는 했는데 어느 정도나 사용하게 될지 가늠할 수가 없어서 넉넉하게 구매하였습니다.

하우징 실리콘

하우징 실리콘

일단 빗물이 스며드는 곳을 잘 마르도록 하고 실제로 시공하기 전 깨끗하게 청소하고 먼지를 제거 하였습니다.

캡을 열고 보니 칼로 위쪽을 잘라내고 치약처럼 짜내서 사용하도록 되어 있습니다. 문구용 커터칼로 자르기는 좀 단단한 것 같았습니다. 간신히 잘랐는데 잘못하면 칼날이 부러질 것 같은 느낌이 들었습니다.

위쪽을 잘라내고 조심스럽게 힘을 주어 짜내면서 시공을 해 보았습니다. 냄새는 거의 나지 않았습니다. 그런데 균일하게 손에 힘을 주면서 짜내는 것이 생각보다 쉽지는 않았습니다. 요령이 없어서 그런지 울퉁불퉁 삐뚤삐뚤… 색상은 투명이라고 하였는데 실제로는 흰색이라고 보면 될 것 같습니다. 아래 사진에서 가로로 가운데 흰색부분이 시공한 부분입니다.

하우징 실리콘 시공 후

하우징 실리콘 시공 후

시공을 해 놓고 비오는 날 확인을 해 보았는데 빗물이 스며들어오는 현상이 없다가 얼마전에 약간 빗물이 스며들었습니다. 제 생각에는 제품의 문제라기 보다는 제가 시공을 하다가 빈 공간이 생겨서 그쪽으로 빗물이 스며든 것 같습니다.

냄새도 없고 시공하기도 편하고 좋은 제품이라고 생각됩니다.