DataTable간 Join하는 방법입니다.
소스 보시면 쉽게 이해가 가능 하 실 겁니다.
DataGridView를 통해서 최종 결과를 뿌려줍니다.
UI디자인에서 미리 만들어 놓으시기 바랍니다.
그럼 소스는…
DataTable dtUser = new DataTable(); DataTable dtDept = new DataTable(); DataTable dtUserInfo = null; DataRow drTemp; //사용자 정보 테이블 - DataTable Column을 추가(Range) dtUser.Columns.AddRange(new DataColumn[] { new DataColumn {ColumnName = "no", Caption = "Increment", DataType = typeof(int), Unique = true, AutoIncrement = true} , new DataColumn {ColumnName = "user_id", Caption = "User ID", DataType = typeof(string), Unique = true, AllowDBNull = false} , new DataColumn {ColumnName = "user_name", Caption = "User Name", DataType = typeof(string), AllowDBNull = false} , new DataColumn {ColumnName = "dept_no", Caption = "Dept. Code", DataType = typeof(int), DefaultValue = -1} , new DataColumn {ColumnName = "is_use", Caption = "IS Use?", DataType = typeof(bool), DefaultValue = true} }); /* * BEGIN DataRow를 이용한 사용자 정보 추가 * */ drTemp = dtUser.NewRow(); //AutoIncrement가 0부터 시작하므로 처음값만 1로 강제 부여 drTemp["no"] = 1; drTemp["user_id"] = "test1"; drTemp["user_name"] = "Tester 1"; drTemp["dept_no"] = 1; drTemp["is_use"] = true; dtUser.Rows.Add(drTemp); drTemp = dtUser.NewRow(); drTemp["user_id"] = "test2"; drTemp["user_name"] = "Tester 2"; drTemp["dept_no"] = 100; dtUser.Rows.Add(drTemp); drTemp = dtUser.NewRow(); drTemp["user_id"] = "test3"; drTemp["user_name"] = "Tester 3"; drTemp["dept_no"] = 3; drTemp["is_use"] = false; dtUser.Rows.Add(drTemp); drTemp = dtUser.NewRow(); drTemp["user_id"] = "test4"; drTemp["user_name"] = "Tester 4"; dtUser.Rows.Add(drTemp); /* * END DataRow를 이용한 사용자 정보 추가 * */ //부서 정보 테이블 - DataTable Column을 추가(Range) dtDept.Columns.AddRange(new DataColumn[] { new DataColumn {ColumnName = "dept_no", Caption = "Dept. Code", DataType = typeof(int), Unique = true, AutoIncrement = true} , new DataColumn {ColumnName = "dept_name", Caption = "Dept. Name", DataType = typeof(string), DefaultValue = string.Empty, AllowDBNull = true} }); /* * BEGIN DataRow를 이용한 부서 정보 추가 * */ drTemp = dtDept.NewRow(); //AutoIncrement가 0부터 시작하므로 처음값만 1로 강제 부여 drTemp["dept_no"] = 1; drTemp["dept_name"] = "IT Team"; dtDept.Rows.Add(drTemp); drTemp = dtDept.NewRow(); drTemp["dept_name"] = "Management Team"; dtDept.Rows.Add(drTemp); drTemp = dtDept.NewRow(); drTemp["dept_name"] = "Project Management Team"; dtDept.Rows.Add(drTemp); /* * END DataRow를 이용한 부서 정보 추가 * */ /* * BEGIN JOIN 이후 DataView등에 사용할 최종 사용자 정보 DataTable 설정 * */ //기존 사용자 정보 테이블 구조 및 스키마만 복사(데이터는 복사하지 않음) dtUserInfo = dtUser.Clone(); //Join으로 추가할 부서 테이블에서 부서명에 해당되는 컬럼 추가 dtUserInfo.Columns.Add(new DataColumn { ColumnName = "dept_name", Caption = "Dept. Name", DataType = typeof(string), DefaultValue = string.Empty, AllowDBNull = true }); //Join 성공 여부 컬럼 추가 dtUserInfo.Columns.Add("is_join_dept", typeof(bool)); /* * END JOIN 이후 DataView등에 사용할 최종 사용자 정보 DataTable 설정 * */ /* * BEGIN 사용자 테이블과 부서 테이블간 JOIN후 최종 사용자 정보 DataTable에 반영 * */ //var : Variable의 약자, C# 3.0부터 추가된 타입이 없는 변수, 초기에 대입되는 값에 의하여 변수의 형식이 결정 됨(int, string, double ... 등 활용 가능) // 여기서는 IEnumerable타입으로 이용 var query = from u in dtUser.AsEnumerable() join d in dtDept.AsEnumerable() //on (int)o["area_index_no"] equals (int)(decimal)e["area_index_no"] into j on u["dept_no"] equals d["dept_no"] into j from jList in j.DefaultIfEmpty() select new { no = u["no"] , user_id = u["user_id"].ToString() , user_name = u["user_name"].ToString() , dept_no = u["dept_no"] , dept_name = (jList != null ? jList["dept_name"] : string.Empty) , is_use = Convert.ToBoolean(u["is_use"]) , is_join_dept = (bool)(jList == null ? true : false) }; foreach (var v in query) { drTemp = dtUserInfo.NewRow(); drTemp.BeginEdit(); //생략가능 drTemp["no"] = v.no; drTemp["user_id"] = v.user_id; drTemp["user_name"] = v.user_name; drTemp["dept_no"] = v.dept_no; drTemp["dept_name"] = v.dept_name; drTemp["is_use"] = v.is_use; drTemp["is_join_dept"] = v.is_join_dept; drTemp.EndEdit(); //생략가능 dtUserInfo.Rows.Add(drTemp); } /* * END 사용자 테이블과 부서 테이블간 JOIN후 최종 사용자 정보 DataTable에 반영 * */ //DataGridView에 반영 dataGridView1.DataSource = dtUser; dataGridView2.DataSource = dtDept; dataGridView3.DataSource = dtUserInfo;
출처 : 자작(userpark)
'Language > C#(CLR,.NET)' 카테고리의 다른 글
[Micrsofot]Team Foundation Server(TFS) 사용시 사용자의 PC명 변경시 Workspace관련 오류 발생시 (1) | 2012.10.09 |
---|---|
[C#] Exchange 메일 목록 읽어오기 (0) | 2012.06.25 |
C# DataSet, DataTable을 XML, XSD로 저장 (0) | 2012.06.12 |
C#에서 Oracle LOB(CLOB) 데이터 입력 방법 (0) | 2012.06.12 |
해당 파일을 다른 프로세스에서 사용 중인지 체크 (0) | 2012.06.08 |