PROGRAMMING WORKSHOP

VB.Net |
System.Data.DataSet...TableAdapter의 역할

앞페이지에서 Orders테이블을 중심으로 주문을 받는 프로세스를
진행하는 것을 만들었었다
어떤 데이타베이스프로젝트를 하던 종국에는 이런 하나의
작업폼이 해당 프로젝트의 사용자 인터페이스(Data Entry Form)가 된다
이곳에서 진행되는 모든 내용이 영업분석의 대상이 되고
세금부과의 대상이 될 것이다

이제 이 폼에서 주문이 발생하고 수정하고 삭제하고 한 내용은
모두 DataSet의 DataTable에 ..즉 메모리상에만 저장이 된 것이고
실은 데이타베이스원본에는 아무 일이 벌어진 상태가 아닌 것이다

또 하나 이 DataSet, DataTable씨리즈는 윈도우폼하나에 한정된
내용이 아니다
이것은 데이타를 다루는 모든 인터페이스와 관련이 있는 것이다
웹페이지에서 데이타를 표현하고 싶어도 이것을 사용하고
VSTO로 만드는 엑셀Addin에서도 사용할수 있는 것이고
모든 데이타를 처리하는 것과 관련이 있는 것이니..
혹...윈도우폼은 나와 관련이 없는데 하시는 분들이 없기 바란다
또한 윈도우폼은 VSTO로 만드는 오피스모든 에디인에 삽입하여
그대로 사용할수 있는 모두 관련된 것들이니
필독들 하시기 바란다

폼에서 정보를 편집하고 저장 버튼을 크릭하면
TableAdapter가 써버에 있는 DB쪽으로 저장작업을 하는 것이다
TableAdapter의 역할이다
폼의 코드보기를 하면 자동으로 작성되어있는 TableAdapter의 역할을
볼수 있다



Orders테이블을 끌어다 놓으면서 자동으로 만들어진 Navigator콘트롤의
Save버튼을 크릭하면 어떻게 하라는 구문이 자동작성되어 있다

Me.OrdersBindingSource.EndEdit()...이것은 필요하고
Me.TableAdapterManager.UpdateAll(Me.OrdersDataSet)..이것은 일을 못한다

첫번째것은 OrdersBindingSource상에서 편집이 끝났으니
다음 DB저장작업을 하라는 명령이다
요기까지는 좋은데
두번째 TableAdapterManager라는 것이 있다
DataSet를 만들면 DataSet은 최소하나의 테이블이 들어 있고
여러개의 테이블이 하나의 DataSet을 구성하기도 한다
여러개의 테이블이 들어 있을 때는 테이블간의 관계가 구성되어 있다
OrdersDataSet을 만들었을때 이 DataSet은 아래의 그림과 같이 두개의
테이블이 관계를 유지하고 있다



위의 그림은 하나의 Orders테이블의 정보가 여러개의 Order_Details의
정보를 갖고 있는 일대 다의 관계를 유지하고 있다는 것을 보여준다
이것은 억세스의 NorthWind.mdb에 설계된 관계를 그대로 끌고 들어와
주는 것을 보여준다

여기에서 TableAdapterMaster는 여러개의 테이블을 한꺼번에
Update...즉 UpdateAll메소드를 사용하는 것이 편리하게 되는 것이다

이것은 위의 그림에서 보듯이 각자의 테이블이 독립적인 TableAdapter를
또한 갖고 있어서 아래와 같이 처리하여도 같은 방법이 된다

두번째 명령줄을 죽이고 아래와 같이 각각의 TableAdapter를
사용하도록 하면 된다..즉 여러개의TableAdapter를 통째로 관리하는
TabelAdapterMangager를 쉬라고 하고
각자 알아서 처리하는 것이다

실은 위의 MasterAdapter로 정상적으로 처리되어야 바람직하지만
NorthWind.mdb화일에 쌤플로 이것 저것 저장한 내용들이
관계의 원칙을 깨는 것들이 있거나 하면 에러가 나게 된다
아래의 그림과 같이 외부키제약을 걸어야 하나



그렇게 하면 관계구성상의 기존데이타가 위반되었다는 에러가
나타 난다
이것이 데이타베이스가 이미 기존에 존재하는데(많은 정보가 담겨있고)
이것을 그대로 살리고 데이타베이스를 개선을 하게 될때
겪는 골치아픔의 원인중의 하나다..
관계의 제약을 야무지게 걸자니 기존데이타가 안맞고
기존데이타를 죄다 다시 처리하자니 작업이 끔찍하고
그런 딜레마에 빠지곤 한다

아무튼 그런 연유에서 위의 UpdateAll메소드에서 신규저장의 경우
부모테이블은 저장이 되는데 자식테이블이 외부키가 아직 형성이
안된 상태라서 에러가 나게 된다
그럴때 각테이블별로 처리하면 되는 것이다

두개의 테이블 하나는 부모역할, 또 다른 하나는 자식역할
Master는 Orders테이블이고
Detail 부분은 Order Deatails 테이블..두개가 부모자식관계를 유지하고
있는 것이다..그러니 두개의 테이블을 각자의 TableAdapter가 처리하면
된다

-------------Orders Table 부분 갱신(저장,삭제,수정)----------------
Me.OrdersBindingSource.EndEdit()---해당 BindingSource의 EndEdit해주고
Me.OrdersTableAdapter.Update(Me.OrdersDataSet.Orders)
-------------Order Datails 부분 갱신(저장,삭제,수정)---------------
Me.Order_DetailsBindingSource.EndEdit()
Me.Order_DetailsTableAdapter.Update(Me.OrdersDataSet.Order_Details)

와 같이 해주면 아주 간단하게 DB에 저장이 되는 것이다
TableAdapter의 역할인 것이다
테이블의 관계가 석연치 않고 할때는 두번째와 같이 각테이블을
처리하는 방법이 좋다
여기에서 TableAdapter의 Update메소드는 과연 무엇일까???



엑셀 VBA에서 DAO를 활용할때 항상 떠드는 SQL문을 실행하는
함수라고 보시면 되는 것이다
뭔 용빼는 수가 없는 것이다..
데이타베이스에 정보를 관리하는 것은 SQL문 인 것이다
단지 DataSet,TableAdapter등으로 어떻게 하면 SQL문같은 것 없이
간편하게 처리하게 할 수 없을까..궁리하면서 자꾸 개체를 만들어 내는 셈이다
그러니 실은 화일이 무거워진다고 하는 등의 이야기를 하게 되고..
SQL문들에 능숙한사람들은..거 뭐 복잡하게 시리..이상한
개체들을 불러서 일을 시키고 그래..그냥 코딩을 열라!!하는게 편하지!!
라고 하는 사람들도 있을 것이다

그래도 이것 저것 알고 안하는 것과 몰라서 못하는 것과는 다르다
이것..저것 새로운 기술을 아는 것이 흥미로운 것이다
그리고 활용하면 더욱 좋은 것이고..
사람들이 습득하고 훈련하여야 한다는 것이 귀찮아서
이런 소리, 저런 소리들을 하면서 피하는 것!!

아무튼 SQL구문은 기본적으로 친해져야 한다는 사실은 잊지 마시기 바란다
그래야..필요할때 TableAdapter를 스스로 편집하여 사용할수 있게
되는 것이다

예를 들어서 상품명의 콤보상자 목록상에 가나다 순으로 품명이
나타났으면 좋겠다고 치면..
프로젝트창에서 DataSet화일인 productLookUpDataSet.xsd 화일을 더블크릭하여
열고 해당 TableAdapter부분을 오른쪽마우스로 선택하여 메뉴상의
Configure을 선택하면 대화창이 나타나고 이곳에 해당 TableAdapter가
갖고 있는 SQL문이 나타난다 이것을 SQL구문실력으로 원하는대로
정렬은 물로 , 정보를 갖여 오게 편집해주면 된다



ProductName 별로 오름차로 갖여오라는 쿼리문으로 수정해주면
당연히 결과는 오름차로 정렬된 목록을 사용할수 있게 되는 것이다

많은 DataSet, TableAdapter,DataTable,BindingSource등등
이름을 잘 지어주어야 헷갈리지 않게 됨을 실감하게 되는
부분들이다

아래 화일은 위의 구문에서
새정보추가 부분에서 외부참조키의 참조상의 에러로
약간의 편법으로 에러를 피하였으니 잘 챙겨 보시기를..

***[LOG-IN]***