PROGRAMMING WORKSHOP

.Net FrameWork,VB.Net | DataSet,DataTable

DataTable과 외부정보창고와 연결

저장버튼을 크릭하는 부분에서
메모리상에 있는 데이타저장창고를 그대로 외부의 어딘가에 옮겨야
다음에 폼을 열때 외부의 정보를 다시 불러 올릴수 있을 것이다
억세스DB에 옮길것인지, 엑셀화일에 보관할 것인지, 텍스트문서에 보관할 것인지
코딩을 하는대 따라서 마음대로 연결할수 있을 것이다

하지만
DataTable과 DataSet의 특징중의 하나는 간단하게 한줄만 표현하면
DataTable의 내용을 XML화일로 옮기고
딱한줄만으로 XML화일의 내용을 DataTable로 다시 가져 올수 있다는것을 활용하면
그냥 간단하게 XML화일하나와 연결하면 되는 것이다

딱 세줄이면 읽고 쓰고 저장하고 끝난다..
우선 전역변수에 XML화일의 위치와 화일명을 정해준다, 아래와 같이

Dim sFileAndPath As String = My.Computer.FileSystem.SpecialDirectories.Desktop & "\mySample.xml"
그리고 정보를 몇개 입력하고 저장버튼의 크릭이벤트에

DataSetSample.Tables(0).WriteXml(sFileAndPath)

그리고 읽어 들어오는 것은
폼의 Load이벤트에서

If My.Computer.FileSystem.FileExists(sFileAndPath) Then
    DataSetSample.Tables(0).ReadXml(sFileAndPath)
End If

와 같이 한줄의 명령이면 된다
해당경로에 화일이 있으면 DataSet의 ReadXML메소드로 읽어서
DataTable에 XML정보를 옮기고..
이미 DataTable은 폼과 바인딩의 되어 있고..
그러니 자동으로 폼에 뜨게 된다

바탕화면(My.Computer.FileSystem.SpecialDirectories.Desktop)에
아래와 같이 xml화일이 저장되었음을 볼수 있다



뭐가 이렇게 간단해..
VBA에서 엑셀시트내용을 XML로 만들려면 외부라이브러리를 참조하여
순환하면서 정보를 하나,하나 XML태그로 만들어서 옮기던가
외부라이브러리가 없다면, I/O함수를 사용하여 XML화일을 텍스트문서다루듯이
작성을 하던가 번접을 떨어야 하는데
어라..이렇게 간단하다니..
바로 DataSet, DataTable 활용의 효과인 것이다
복잡한 것은 내가 알아서 할테니, 나를 잘 활용해라!! 라고 사용하기를 기다리고 있는 것
그러니, 이개체가 이런 것 하나의 좋은 기능만 있을까..
이제 부터 그것을 살펴보면서 활용하도록 하자
윈도우프로그래밍을 한다고 하면서
DataSet과 DataTable이 뭔개체인지 모른다면 허당이다
그럼 간단한 것은 그냥 이렇게 만들어서 사용해도되겠네?!

화일의 사이즈와 속도에 문제가 있지 않을까?
상황에 마추어 활용하면 된다
테스트해보면?
버튼을 하나 달고 1000개정도 저장해 보고 로딩하는 상태를 한번 살펴보자

Dim oTbl As DataTable = DataSetSample.Tables(0)
Dim oRow As DataRow
For ix As Integer = 1 To 1000
    oRow = oTbl.NewRow
    oRow.Item(1) = getRandomName()
    oRow.Item(2) = Now.Date + New TimeSpan(IIf(Int(Rnd() * 2) = 0, -1, 1) * (Int(Rnd() * 1000) + 1), 1, 1)
    oTbl.Rows.Add(oRow)
    Me.Text = ix
Next
oTbl.WriteXml(sFileAndPath)

DataTable에 정보를 추가로 입력한다고 하는 것은 행을 추가 하는 것이다
열의 구조는 이미 DataSet에서 만들어 놓은 것이고..
DataTable은 Column, Row등 역시 모두 개체이다
그래서 행을 추가하려면..
Dim oRow As DataRow
라고 순환문밖에 만들던, 안에서 계속만들던 상관없지만, 순환문 밖에 놓고
순환하면서 행을 계속 만들어낸다, 이때 DataTable의 NewRow 속성으로 만들수 있다
이렇게 만들어진 하나의 행의 각열, 즉 각각의 셀을 DataTable에서는 Item으로 접근한다
VBA의 엑셀과 같이 Cells(1)과 같이 접근하지 않는다
첫번째 열은 ID값이고 이것은 자동입력되는 것이라서
oRow.Item(0) 에 값을 주면 에러난다..
TimeSpan개체는 아주 편리한 시간을 다루는 개체이다,
어떤 날짜나 시간에 정확한 기간(Time Span)을 만들어서 추가 하면 새로운
날짜나 시간이 되니까..편리할 것이다
VBA의 DateAdd 함수를 사용해도 되지만, 이왕이면 새롭게 제공되는 것을
활용하는 것이 좋은 습관이다

위와 같이 정보를 추가하면 아래의 그림과 같이 데이타갯수가 변한다



콘트롤은 DataTable에 연결되고 DataTable은 XML화일의 정보와 연결되고
하나로 연결되어서 움직이는 것

다시 폼을 닫고 다시 실행할때는 정보를 읽어 들여 올 필요가 있을 것이다
DataTable개체와 XML원본과 연결초기화를 어디에선가 시켜야 할 것이다
아래와 같이 역시 한줄만 작성하면 된다
위에서 WriteXML을 한것과 반대로 ReadXML


''폼의 Load 이벤트에서..
Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    setDataTable()
    setControls()
End Sub

Sub setDataTable()
''xml화일이 있는지 확인하고, 있다면
    If My.Computer.FileSystem.FileExists(sFileAndPath) Then
        DataSetSample.Tables(0).ReadXml(sFileAndPath)
    End If
End Sub


  

***[LOG-IN]***

조금더 DataTable과 XML관련에 대하여 살펴보자
XML과 연결하던 XL과 연결하던 DB와 연결하던 외부의 창고는 상관없다
아무튼 메모리상의 창고(임시창고) DataTable개체에 불러 들이면 되는 것이다
그러면 DataTable개체와 윈도우폼의 콘트롤등과 협조관계가 자동으로 세련되고
구현되는 것이다
그러니 간단한 XML과 연결하는 것만 다를뿐,
DataTable의 특징을 살펴보고 익숙해지는 것은 나중에 어느 외부정보와 연결해도
되는 내공을 키우는 것이다

DB에서 관계형테이블이라는 것을 많이 들어 보셨을 것이다
XML로도 그것이 되나요????
당연히 된다
다음 페이지에서 이것을 만들어 보고
DataTable의 파워를 느껴고 나의 것으로 만들어 보자