PROGRAMMING WORKSHOP

VB.Net |
System.Data.DataTable,DataSet, DataView

XML은 정보를 주고 받는 중요한 문자열정보이다
XML문서를 DataGridView에 표현해 보자
엑셀에서 XML을 이야기 할때는 이 것을 왜 써야 하는지 당위성을
설명하기가 참 어려었다..
그래서 좀 이야기 하다가..별로 신이 안나서 때려치곤 하던 것이다
왜냐면 엑셀은 시트자체가 데이타테이블..데이타창고역할을 하다 보니
왜 XML이야기를 자꾸 하냐는 소리를 듣게 된다
그러나 다른 프로그램에서 XML은 작은 정보창고, 임시정보창고로서
역할이 대단한 녀석이다

그래서 이렇게 VB.Net화일을 만드는 것이 재미있는 일이다
MS에서 제공하는 간단한 쌤플 Books.xml화일을 프로젝트에 포함시키고
이것을 읽어서 DataGridView에 표현해 보도록 하자
앞페이지에서 DataTable을 통하여 XML화일을 생성하는 것을 했었다
이렇게 생성한 XML화일은 물론 엑셀에서도 불러서 읽게 활용된다..

이번에는 DataTable에 읽어 들여서 자유롭게 활용해 보자
역시 DataTable 개체를 생성하고
이 개체의 readXML 메소드를 호출하면
같은 이름의 4가지 방법이 나타난다



그런데 이것중에 하나 FileName이라는 매개변수를 사용하여 불러들이면
에러가 난다..
이유는 DataTable의 열의 구조를 구성하지 않은 상태에서
불러서 그렇다..
이렇게 한다면 XML마다 화일을 열고 열의 갯수를 확인하고
정보의 타입을 확인하고..열을 생성해나가야 할 것이다
물론 XML스키마화일이 포함되었다면 그냥 열리겠지만
books.xml화일은 스키마정보(데이타의 구성구조정의)가 없는
단순한 정보만 있는 화일이다
귀찮으니..

이 열의 구조를 그냥 XML에서 알아서 해석하고 열을
스스로 만들게 하는 방법이 없을까??

여기에 드디어 DataSet이라는 DataTable을 여러개 관리하는
개체가 출연하게 된다
Dim oDataSet As New DataSet하고
아래와 같이 ReadXML메소드를 보니 이것은 방법이 8개나 된다



쎈놈은 쎈놈인 것이다..무기가 많잖아!!
이 놈이 XML을 읽어서
XML의 열구조를 해석하여 스스로 테이블의 열구조를 (Schema)만들어
버리는 것이다..
그러니 그냥 XML 화일명만 주면 알아서 테이블을 만드는 것이다

참으로 간단하다..아래의 몇줄이면 어떤 XML화일이던 불러들인다

Dim oDataSet As New DataSet
oDataSet.ReadXml("books.xml")
DataGridView1.DataSource = oDataSet.Tables(0)

DataTable이 아니고 DataSet을 생성하고
DataSet의 ReadXML메소드로 화일을 불러들이면
DataSet이 DataTable을 생성하는 셈이다
DataSet은 여러개의 DataTable을 관리하는 메모리상의 최고지휘부가 되는 셈이다
그래서
DataGridView1.DataSource 속성에
oDataSet.Tables(0)
즉 최초로 테이블을 DataSet개체가 하나 만들었으니
보관하고 있는 DataTable은 1개이고 이것을 참조하려면
DataSet.Tables(0)
으로 참조가 되는 것이고..이렇게 하여 DataSource속성에
전달한 것이니..별도로 DataTable을 만든 것이나 마찬가지인 것이다



DataSet개체는 테이블자체의 스키마를 생성하는 기술을 갖고 있는 것이다
DataTable을 생성할때
Columns.Add...
Columns.Add...
같은 것을 XML을 읽으면서 자기가 알아서 하는 셈이다
그러니 이제 DataTable과 더불어 DataSet과 친해질때가 된셈이다
실은 ADO.Net에서 DataSet에서 DataTable로 내려오고 이것을
연결하는 콘트롤(DataGridView같은 것)로 내려가는 순서로
학습을 하지만..여기에서는 밑에서 부터 꺼꾸로 올라가고 있는 셈이다..^__^

어쨌거나 모두 알아야 하는 것이고..
꺼꾸러 올라가는 것이 좀더 이해하기 편하기 때문에
그렇게 가고 있다

DataSet 개체 즉 DataTable을 모아서 관리하는 사령부
이것을 프로그래밍적으로 생성하고 접근하였는데..
이것을 마우스로 Design Time에 만들수 있나요???
라는 의문을 갖는다면 다행이다
프로그래밍적으로 어떤 개체를 만든다고 하는 것은 특별한 것을
제외하고는 모두 마우스로 아이콘을 끌어다 놓으면서
만들수 있다
예를 들어서 DataSet이라는 것을 소루션내에 하나 만들고 싶다면
프로그래밍적으로도 되지만
아래의 그림과 같이 생성할수 있는 것이다



1,프로젝트창에서 오른쪽마우스크릭하여 새아이템추가
2,추가 창에서 DataSet이라는 아이콘을 찾아서 추가
3,DataSet1.xsd라는 화일이 프로젝트창에 생성되었다
     xsd확장자가 어디서 많이 본것 같다
     이것은 XML Schema Document 약자 XSD인것이다
     이것이 소위말하는 xml화일의 스키마화일인 것이다
     데이타를 정의하는 화일인 것이고
     xml문으로 되어 있다
     여러분이 이곳에 테이블을 만들면 테이블에 대한 정의가
     xml문으로 작성이 되는 것이다
     엑셀에서 xml화일을 열면 스키마가 없습니다..생성하시겠습니까??
     뭐 그런 메시지를 많이 보셨을 것이다
     XML관련은 이렇게 도구에서 자동생성되니까..우리는 그냥
     xml관련화일을 잘 활용하면 되는 것이다
     만약에 나중에 모바일폰관련 소루션을 만든다고 할때..
     xml로 된 정보들은 아이폰이던..안드로이드폰이던..윈도우폰이던
     데스크탑이던 모든 기기에서 공통으로 활용되는 정보의 관리형태인것이니
     이렇게 활용하는 예제를 보시면서 xml과 친해지면 되는 것이다
     여러분이 갖고 있는 엑셀시트의 정보가 있는데 이것을
     아이폰의 앱을 하나 만들었는데 이곳의 정보로 활용하고 싶다면
     워크시트의 내용을 xml로 변환시켜서 활용하면 어느 환경에서나
     사용되는 것이다
     그래서 DataTable의 ReadXml은 안되고
     DataSet.ReadXML이 되는지 알수 있는 것이다
     DataTable은 XML스키마를 만들지 못하지만
     DataSet은 자체가 XML스키마 도구이나 자동으로 테이블을 만드는 것이다
4,열린 DataSet.xsd화면에서 오른쪽마우스를 크릭하고 Add를 하면
5,DataTable,TableAdapter,Query등 몇가지를 추가할수 있는 메뉴가 나타난다
6,이곳에서 DataTable을 추가하면 빈 테이블 구조가 나타난다
7,이것을 다시 오른쪽마우스 하여 Add하면 Column이 나타난다
즉 Column을 추가하면 테이블의 구조...스키마가 만들어지는 것이다

아직 DataSet를 이야기 할 시점이 아닌데..
DataTable.ReadXML에서는 에러가 나고
DataSet.ReadXML은 왜 되는지..를 하는 것이 좋을 것 같아서 이야기했다
다음에 또 이야기할 것이다
그럼..DataTable의 ReadXML은 어디에 써먹냐고 할 수 있을 것이다
에러가 나는 것을 도대체 왜 넣었냐고@#$!!
만약 DataSet에 DataTable이 하나 만들어진 상태라면
DataSet.Tables(0).ReadXML 은 되는 것이다
이미 스키마(테이블구조)가 만들어진 테이블에 정보만 담는 일이니까...!!
물론 프로그래밍적으로도
oTbl=New DataTable
oTbl.Columns.Add...
oTbl.Columns.Add...
oTbl.Columns.Add...
를 하여 테이블 구조(스키마)를 만들었다면
oTbl.ReadXML으로 테이타를 갖여 오게 되는 것이 가능해지고..

테이블의 구조..(스키마)라고 해서 뭐 거창한 것도 아닌 것이다
즉 테이블의 열을 만들어 주는 것이다
테이블이 몇개의 열로 구성되고
각각의 열의 규격(열에 담길 정보의 타입과 크기)은 어떻다고 정의를
한 것이지 ..그 이상..그 이하도 아니다

좀더 쉽게 이야기하면 변수를 테이블이라는 그룹으로 하나 만든 것이라고
보면 된다

아하..메모리상에 데이타창고를 구성하는데 있어서
요따위 방법을 사용하는 구나..
배열의 확장이라고 생각하셔도 좋고..
집합체의 확장이라고 생각하셔도 좋고..
정보를 떼거리로 구조적으로 조직적으로 안정되게 관리하는
하나의 방법론이라는 ..그런 개념으로 받아들이고 계속 가면 된다

단순히 XML화일을 데이타소스로 갖여 오는 것이 싱거우니
아래의 그림과 같이 콤보상자를 하나 달아서
콤보상자에서 알파벳을 선택하면 첫째열의 정보의
첫문자가 해당 알파벳인 것을 휠터링하는 기능을 추가하자

Combo상자도 DataGridView나 같이
데이타를 떼거지로 받아주는 콘트롤이다
이 말은 DataSource속성을 갖고 있다는 것이고
DataSource속성에 떼거리 정보를 전달하는
방법도 역시 마찬가지 인 셈이다
처음에 DataGridView를 중점적으로 하면 관련 콘트롤은
거저 먹는다는 소리가 바로 이런 소리다

그러니

Dim oList As New ArrayList
For iX As Integer = 0 To 26
....If iX = 0 Then
........oList.Add("ALL")
....Else
........oList.Add(Chr(iX + 64))
....End If
Next
Me.ComboBox1.DataSource = oList

하여 DataSorce에 전달해도 되고
VBA에서 배열 만들듯이 똑같은 방법으로

Dim sX(0 To 26) As String
For iX As Integer = 0 To 26
....If iX = 0 Then
........sX(iX) = "ALL"
....Else
........sX(iX) = Chr(iX + 64)
....End If
Next
Me.ComboBox1.DataSource = sX

하여도 되고

VB.Net문법으로 아래와 같이 배열을 만들어
주어도 좋고

Me.ComboBox1.DataSource = New String() {"ALL", "A", _
"B", "C", "D", "E", "F", "G", "H", "I", _
"J", "K", "L", "M", "N", "O", "P", "Q", _
"R", "S", "T", "U", "V", "W", "X", "Y", "Z"}

이런 내용이 반복되니.. 어느 정도 감이 잡혀 가실것이다..
좀더 나가면 나름대로 고수라고 하는 분들도 헷갈리는
여러가지를 잘 소화시킬 수 있을 것이다

다시 한번 강조하지만 ..
VBA에서 배운 문법은 그대로 사용할수 있다
단지 개체들만 새로운 것을 만난다는 점..
그러니 VB.Net의 문법과 스타을 조금씩 받아들이면
VBA던 VB.Net이던 자유스러워지고..
또한 VB.Net문법으로 자연스럽게 진행이 되면..
다른 언어에 접근하기가 쉬워진다

언어의 문법은 별 문제가 아니고
예를 들어서 위의 콤보상자에서 어떤 알파벳을 선택하면
새로운 개체의 속성이나 메소드에 뭔가 작업을 시켜야
하는 부분..이런 것은 문법과 상관없는 새로운 개체의
VBA로 엑셀과 VBA로 다루는 다른 개체들 외에
새로운 파워좋은 자동차를 하나 샀다고 하는 것과 같다
새로운 자동차의 운전방법은 엑셀이라는 자동차를 운전할때와
거의 같다..
하지만 다양한 편리한 기능들이 달려있는 것이다
바로 .Net FrameWork가 그런 것이다

엑셀에서도 휠터라는 기능이 있다..
데이타를 다루는 모든 프로그램은 휠터링하는 기능이 죄다 있다
어느 놈이 더 편리한가???라는 것이 문제인것이다
새로산 파워풀한 자동차의 것이 좋겠지!!

콤보상자의 SelectedIndexChanged 이벤트프로시져에

Private Sub ComboBox1_SelectedIndexChanged(....)
'''''첫열의 휠드명을 DataGridView.Column에서 읽어내고
Dim sFirstFldName As String = Me.DataGridView1.Columns(0).Name
'''''DataGridView의 DataSource에서 DataTable 을 다시 얻고
Dim oTbl As DataTable = Me.DataGridView1.DataSource
''''DataView개체가 휠터,정렬등의 일을 한다고 했다
''''그래서 DataView개체를 DataTable의 DefaultView로 얻고
Dim oView As DataView = oTbl.DefaultView
'''DataView의 RowFilter속성에 얻고 싶은 내용을 [문자열정보]로
'''전달하면 된다
If ComboBox1.Text = "ALL" Then
....oView.RowFilter = ""
Else
....oView.RowFilter = sFirstFldName & " Like '" & ComboBox1.Text & "*'"
End If

다시 한번 또 이야기 하지만..
휠터, 정렬들의 속성에 조건을 주는 것은
주간강좌에 이 강좌를 의식하여 열심히 하고 있는
SQL언어의 Where절(조건절)을 그대로 사용한다고 보시면 된다

VBA에서 외부라이브러리 특히 DB를 다루는 부분을
관심을 갖고 보시면 모두 거저 먹는 셈이 되니..
나중에 퇴직하고 무어라도 하시고 싶으시면
틈틈히 내공을 쌓으시기 바란다

퇴직연금이 빵빵해서 전혀 관계없이 팽팽 놀아도 된다면
안해도 되지만...
실은 팽팽 놀면 병걸려 쉬죽는다는 점도 자연의 법칙이니..
잘 챙기시기를!!!

***[LOG-IN]***