PROGRAMMING WORKSHOP

VB.Net |
DataGridView+Excel화일을 데이타쏘스로..

몇페이지에 걸쳐서 DataGridView의 특징을 살펴보았다
이제 본격적으로 DataGridView의 제역할을 시켜보도록 하자
DataSource가 중요한 자리를 차지한다
DataGridView는 DataSource의 내용을 표현하는 쑈케이스(GUI)이지
진정한 정보들은 아닌 것이다
제대로 일을 시키려면 정보를 잔뜩 불러들여서 일을
시켜야 한다
정보의 쏘스가 되는 것은 다양하지만 우선 엑셀화일을 사용해보자
엑셀화일을 다이렉트로 DataGridView와 연결이 되지 않는다
DataGridView의 DataSourc속성이 원하는 형태로
바꾸어서 연결하여야 한다는 점!!
이떤 데이타쏘스라도 마찬가지다
DataGridView가 데이타원본과의 접점은 DataSource속성이라는 점
그렇다면 DataSource속성의 입맛에 맞는 것으로
가공하여 전달하여야 한다
앞페이지에서
DataSoruce로서 DataTable이라는 개체를 만들어서 연결을 하였었다
사용자정의 개체를 만들어서도 연결을 하였었다
배열을 연결을 하기도 하였었다

실은 이 부분에서 데이타베이스의 인터페이스(GUI)를
MS Access로 쓰는 것이 좋으냐..
아니면 Window 폼으로 쓰는 것이 좋으냐?는 항상 이슈꺼리다
Access도 훌륭하고 외국에서는 Access를 무척이나 많이
사용하고 있고 인터넷커뮤니티도 활발하다..
실은 우리는 DB에 대한 상식이 많이 떨어져서
뭐가,뭔지 잘 모른다..
DB에 대한 상식이 생활화되어 있는 사람들은 억세스를
참 알뜰 살뜰 잘 활용한다
무조건 큰 것만 좋아하는 사람들에게는 억세스 DB는 공연히
얕잡아 보고 선호하지 않는 그런 것이다
억세스를 잘 활용하면 엑셀에 너무 무리한 일을 시키지 않아도
되는데..억세스에 접근하기 꺼려한다
아무튼 억세스인터페이스는 기회가 되면 하기로 하고
지금은 VB.Net 윈도우폼에 몰입하고 있다

그림과 같이 사용할 엑셀데이타화일을 소루션창에 추가하고
데이타화일이니까..반드시 속성을 Copy if newer로 해주고
이제 이 화일의 정보를 DataGridView에 불러 들여 본다



아마도 엑셀프로그래밍을 열심히 하신 분들은
이런 코드가 생각날 것이다

Dim oDBEngine As New DAO.DBEngine
Dim oDB As DAO.DataBase
Dim oRST As DAO.Recordset
Set oDB=oDBEngine.OpenDataBase("경로및화일명",False, False, "Excel 8.0")
Set oRST=oDB.OpenRecordset("SELECT * FROM 테이블명 WHERE 휠드명='xxx'")
WorkSheets.Add.Range("A1").CopyFromRecordset oRST

위에서 중요한 것은 빨강색의 문자열로 구성된 SQL문과
엑셀을 데이타베이스로 중간역할을 해주는 Excel 8.0 드라이버명이다
나머지 개체는 그렇게 중요하지 않다
왜냐면 몇개 되지 않는 개체이니까..

엑셀을 데이타베이스로서 불러 들인다면
우선 어떤 개체들이 데이타베이스를 다루는 것들인지 감은 잡아야 할 것이다
이 개체들은 나중에 별도의 챕터에서 본격적으로 이야기하겠지만
우선 감만 잡자..대강 감만 잡아도 왠만한 것은 다 한다
크게 세개의 네임스페이스가 있다



하나는 특별히 SQL서버의 데이타베이스를 다루는 SQLClient라는 네임스페이스로서
이것은 SQL서버를 사용할때 사용하면 된다
또 하나, 위와 같이 SQL서버외의 데이타베이스(엑셀,억세스 기타)등에
접근하려면 통털어서 OLEDB 네임스페이스하의 개체를 사용하면 된다
ODBC는 OLE DB이전의 것이니까..그냥 잊어버리고 OLEDB것을 사용하시면 된다
모두 개념은 거의 같다..
쉽게 말하여 사용하였던 DAO나 같은 개념의 개체들이라고 생각하면 쉽겠다
좀 다른 것은 네트워크를 넘나들고(물론 DAO도 가능) .Net FrameWork이
제공하는 다른 데이타관련 개체들과
연합작업이 자유로운 파워풀한 것들이라는 점..

엑셀 VBA,DAO의 기본을 계속 잊지 말고 지금이라도 잘 챙기시기를..
시간이 없다구..???트윗질할 시간에 해도 된다
시간 없다는 것은 죄다 구라다!!!

이런 것 해서 어떠 써먹나???그런 회의감을 갖는 시간에
해도 된다..할까..말까..로 소비하는 시간이 아마도 어마어마 할 것이다
인생을 할까..??말까..??로 허비하는 것 보다는 하는 것이 좋다
또한 엑셀은 잘 하면 당장 써먹는다!!
아무튼 알아서 할 일이고..!!

ADO.Net의 개체를 활용하여 아래와 같이 가볍게
엑셀시트의 내용을 DataGridView에 쏟아 부었다

Try
  Dim oConnection As System.Data.OleDb.OleDbConnection
  Dim oDataSet As System.Data.DataSet
  Dim oAdapter As System.Data.OleDb.OleDbDataAdapter
  oConnection = New System.Data.OleDb.OleDbConnection _
  ("provider=Microsoft.Jet.OLEDB.4.0;Data Source='exceldatas.xls';Extended Properties=Excel 8.0;")
  oAdapter = New System.Data.OleDb.OleDbDataAdapter _
      ("select * from [datas$]", oConnection)
  oAdapter.TableMappings.Add("Table", "TestTable")
  oDataSet = New System.Data.DataSet
  oAdapter.Fill(oDataSet)
  DataGridView1.DataSource = oDataSet.Tables(0)
  oConnection.Close()

Catch ex As Exception
  MsgBox(ex.ToString)
End Try

중요한 것은 빨강색구문이다
나머지는 수첩에 몇개 개체의 역활을 정리해두고 필요할때 사용하면된다
몇번 그렇게 하다 보면 자동으로 외워지던가 그냥 머리속에 남게 될 것이고
프로그래밍을 한다면 위의 두번째 빨강색만 창의적으로 작성하면 되는 것이다
즉 SQL문을 작성하는 것이 일이 될 것이다
원하는대로 보고 싶은 정보를 원하는대로 작성할수 있어야 하니까..

첫번째 빨강색은 세미코론으로 3개의 속성이 문자열로 연결되어 있다
Provider="".............억세스테이타엔진과 통역을 하는 작은 프로그램지정
Data Source=""..........엑셀화일 즉 데이타화일의 위치
Extented Properties=""..특별히 쏘스가 엑셀이라는 지정
3개의 속성정보가 OleDbConnection개체생성에 필요한 기본필수정보이다
아래와 같이 하여도 된다

Dim oCon As New System.Data.OleDb.OleDbConnection
oCon.ConnectionString = "provider=Microsoft.Jet.OLEDB.4.0;Data Source='exceldatas.xls';Extended Properties=Excel 8.0;"
이것은 그냥 수첩에 적어두던가 하면 된다..중요하지 않다

OleDbConnection의 개체생성후
ConnectionString속성에 연결정보를 준것이다
연결을 위한 기본정보인 것..
사람을 찾아가는데 기본적으로 주소도 알아야 하고,
뭐 전화번호도 알아야 하고 그 사람이 사용하는 언어가 영어인지
일본어인지도 알아야 만나도 만나게 되는 것과 똑 같다
어떤 데이타베이스에 접근하던 위의 ConnectionStirng정보만 확실하게
정해진 것을 전달하면 해당 데이타베이스와 연결이 된다는 개념
잊지 않으시면 된다
사람을 만난다 연결정보가 있어야 한다!!!라는 절차!!!

좀 복잡해 보인다..
DataBase를 Connection개체로 개통을 하면 전기가 콘센트에만
들어와 있는 상태다
이제 이 전기를 여러분의 컴퓨터에 전원을 넣으려면
아답타가 있어야 한다..
위에서 DataAdapter라고 하는 개체가 그런 역활이다
이것이 또 조금더 진화되면 나중에 TableAdapter라는 높은 지능의 것이
되지만..아무튼 Adapter라는 개체가 있다는 것을
그리고 이놈이 있어야 어떤 정보를 어떻게 갖여 올것인지
어떤 정보를 어떻게 저장할 것인지 행동대원역할을 하는 것이다
Connection개체는 길만 딱고 다리만 놓아둔 것이고
Adapter는 그 교량위를 오고가면서 정보를 실어 나르는 역할을
하는 것이다
이제 DataSet이라고 하는 것이 있다
DataSet은 여러분의 컴퓨터상의 메모리속의 수많은 창고라고
보시면 된다
DataSet의 Set이라는 단어로 힌트를 얻을 수 있듣이
앞페이지에서 다루어 왔던 DataTable이라는 것을 기억하시기 바란다
이런 DataTable이 하나만 만들어 놓는 것이 아니고 여러개 만들어 놓을 수
있는 것이다 ..그래서 DataSet이라는 커다란 창고를 생성하는 것이다
위의 엑셀에서 갖여온 데이타는 달랑 하나의 DataTable이
되는 셈이니 이것은 DataSet(0) 즉 DataSet중의 여러테이블중의
하나로 접근되는 것이다

엑셀 통합문서를 생각하시면 더욱 쉬울 것이다
엑셀통합문서가 하나의 DataSet이고
수없이 추가될수 있는 DataTable이 워크시트라고 보시면 된다

왜 이렇게 DataSet을 메모리상에 만들어 놓냐하면
인터넷등을 통하여 데이타써버에서 데이타를 매번 들락날락
실어다 나르고 저장하고 하는 것은 자원의 낭비인 것이다
한꺼번에 필요한 테이블을 셋트로 실어다 놓고
작업을 하면 효율적이지 않겠는가
세상의 일과 같다고 생각하시면 좋다
즉 DataSet에 정보를 실어다 놓고 Connection은 딱 끊어져도
메모리상에 DataBase상의 것과 같은 것이 임시로 만들어지는 셈이다

이해가 아직 안가면 위의 몇 줄안되는 코드를 외워도 된다
그러다 보면 자꾸 사용하게 되면 자연스럽게 이해하게 된다
위의 이야기를 개념적으로 표현하면



위의 것은 한가지 방법이고 또 다른 방법도 있다
간단하게 사용할때는(편집이 필요없고 읽기전용)
DataAdapter대신에 Commnad개체라는 것을 사용하기도 한다
이때는 DataSet필요없이 그냥 DataReader라는 단순한 하나의
테이블형식(읽기전용)에 쏟아 붇고 이것을 활용하기도 한다

아래의 화일에서는 위에서 본 코드의 내용과 더불어
DataAdaper가 아닌 Command개체를 이용하여 DateReader에 정보를
갖여 온후 DataTable에 옮겨서 DataGridView의 DataSource에
연결하는 두가지를 해보도록 한다
요점은 DataGridView의 DataSource속성이 받아주는 개체를
만들어서 전달하는 것이 목적이다



Command개체를 활용하여 DataReader에 불러 오는 작업은
uno-xl-programming 참고서에 진행하는 ADO와 같은 내용이니
같이 참고하면서 보시는 것이 좋을 것이다

DataBase를 다루는 것은 Command개체를 활용하여
직접 DataBase에서 정보를 매번 갖여 오거나 보내는 것도 필요하고
DataAdapter를 활용하여 DataSet에 정보를 한꺼번에 불러서 사용하는 것이
필요하기도 하니 , 어느 것이 좋고, 나쁜 것이 없다
모두 잘 이해하고 활용하는 것이 좋다

***[LOG-IN]***

많은 것을 한꺼번에 이야기 하려니 헷갈리시겠다..
다음 페이지에서 좀더 차근 차근 진행하도록 하자