.net DataTable.Select() 사용

그리드 컨트롤이나 텍스트박스, 콤보박스 등의 컨트롤에 보여주기 위해서는 DB에 쌓여있는 정보를 select하여야 합니다.
하지만 이런경우가 생겼습니다. 1000개의 정보를 DB에서 불러왔습니다. 그런데 화면에서는 3개의 영역으로 나누어져 1000개의 데이터에서 Gubun 칼럼이 'big', 'middle', 'small'에 속한 정보들을 각각 3개의 영역에 리스트 형식으로 보여 줘야 하는 경우가 있을 수 있을겁니다.


이런 경우는 어떻게 해야 할까요? DB를 3번 왔다갔다 해야 할까요? 그래서 .net에서는 DataTable.Select()를 제공 합니다. 오늘은 .net DataTable.Select() 사용에 대해서 알아보도록 하겠습니다.





사용은 DB에서 select하는 것과 비슷합니다.
먼저 DB에서 가져온 1000개의 정보를 DataTable dt1000 = new DataTable(); 데이터테이블에 바인딩되어 있다고 합시다.
그리고 이 dt1000에서 Gubun 칼럼의 값이 'big'인 정보만 뽑으려면 아래와 같이 해주면 됩니다.

DataRow[] drBig = dt1000.Select("Gubun='big'");
drBig에는 dt1000에서 뽑힌 Gubun 칼럼이 'big'값을 가진 데이터로우들이 배열의 형태로 쌓여 있습니다. 이런식으로 'middle', 'small'의 값에 해당하는 정보도 얼마든지 추출 가능 합니다.

하지만 간혹 대량의 데이터를 처리하기 위해서 DataTable.Select() 이용시 속도가 느려지는 현상이 있다고 합니다.

이럴경우 에는 어떻게 대처하는지 아래와 같이 다른 분들의 의견을 퍼와서 공유 드립니다.

----- 하기는 DataTable.Select() 메소드의 관한 속도 향상 처리에 관한 퍼오기 -----
많은 수의 Row를 처리할때 DataTable.Select() 메소드를 이용하면 처리 시간이 급격히 늘어나는 경우가 있다.

비공식적인 MS 관계자의 말에 따르면 Select 내부에서 검색시  BTree를 이용한단다.
대용량의 처리와 성능이슈를 해결하기 위해서...
하지만 이때문에 특정 시나리오에서는 오히려 성능이 더 안좋은 경우도 생긴단다.

각설하고...




Select() 메소드 내부에 들어가는 Filter가 단순하다면(한개의 컬럼만을 비교한다면...) 해당 컬럼으로 미리 정렬한 후에 Select() 메소드를 호출하면 성능이 훨씬 좋아진다.(BTree이기 때문에...)

아래의 코드를 이용하여 DataTable을 정렬한다.

DataTable.Select(null, "colName");


----- 하기는 DataTable.Select에 그룹핑 하는 방법 -----
구글검색 DataTable.Select에 그룹방법(DISTINCT)
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/e6f7e2d7-662c-49d1-b56e-71dcd06ddbf5
Q : How??
myTable is a DataTable
DataRow[] DataRows = myTable.Select("DISTINCT FirstName");
return DataRows
A : DataTable.Select is not.
DataTable nonDistinctTable;
// fill the non distinct table...
// If the table has all the data and doesn't need filtering you can do the following...
DataTable distinctTable = table.DefaultView.ToTable("DistinctTable", true, "Col1");
// If the table needs further filtering you can use the DataView to filter, then 'convert' to a DataTable...
DataView view = table.DefaultView;
// set the row filtering on the view...
view.RowFilter = "Col1 = 'XYZ'";
// then get the distinct table...
DataTable distinctTable = view.ToTable("DistinctTable", true, "Col1");
ex --------------------------
  string strDivYstNig = "";
  DataTable dtRepYstNigGrp = ds.Tables[1].DefaultView.ToTable("DistinctTable", true, "CD_NM");
  for (int i = 0; i < dtRepYstNigGrp.Rows.Count; i++)
  {
   string strColNm = dtRepYstNigGrp.Rows[i]["CD_NM"].ToString();
   int iColNm = ds.Tables[1].Select(string.Format(" CD_NM = '{0}' ", strColNm)).Length;
   strDivYstNig += strColNm + ";" + iColNm.ToString() + ";";
  }
  lblMangerNm.Text = strDivYstNig;

댓글

이 블로그의 인기 게시물

껌 떼는 법 (완벽 제거)

인성검사 팁 (인성검사 합격)

[엑셀] 셀에 수식 적용하는 모든 것 완벽 정리