본문 바로가기
Education/Bit 18th

[WMADG] DataSet과 SqlCeResultSet의 차이

by ★용호★ 2009. 12. 22.

DataSet과 SqlCeResultSet의 차이

 

DataSet과 SqlCeResultSet 모두 데이터가 연결된 GUI의 데이터 소스로 쓰이거나 자료를 다루기에 적합하다.  하지만 비슷한 점은 그것뿐이다. 

DataSet 객체의 기능은 매우 다양하고 DataColumn 객체의 컬렉션으로 이루어진 DataTable 객체에 DataRow 객체로 표현되는 데이터 레코드들을 저장할 수 있다. 

DataSet은 열의 모든 값에 null이 저장될 수 없게 하거나 열의 모든 값이 유일한 값을 가지게 하는 것처럼 테이블에 저장한 자료에 제약을 걸 수도 있다. 

외래 키와 같은 관계를 나타낼 수도 있다. 

사실 DataSet은 관계형 데이터베이스와 매우 유사하다. 

DataSet은 행이 데이터베이스에서 가져온 자료로 채워질 때 각 행의 값을 기억하는 기능을 가지고 있고, 행이 업데이트 된 다음에 새 값을 별도로(자체 내에) 저장할 수도 있다.


SqlCeResult는 이와 상당히 다르다.  SqlCeResult는 자체적으로 값을 저장할 수 없으며, 데이터베이스로부터 직접 자료를 읽어오고 갱신하는 데 사용되는 가벼운 객체다.


윈도우 모바일 애플리케이션 개발가이드 P.144 그림 3-9는 이런 차이점을 보여준다. 


DataSet의 경우는 닷넷 프레임워크로 작성된 분산 애플리케이션의 모습과 동일하다.

DataSet은 데이터베이스로부터 자료를 복사하거나 객체에 자료를 저장한 뒤에 데이터베이스 연결을 종료하기 위해 TableAdapter 객체를 사용하는 경우를 위해 설계됐다.

TableAdapter를 사용해서 객체(DataSet)를 어디로든 전송할 수 있다. 

웹서비스나 닷넷 리모팅을 사용해서 원격 클라이언트로 보내거나 객체를 파일로 저장해서 전송할 수도 있다.(심각하게 생각할 것 없다. 구조상 그렇게 보내야 할 수도 있다.) 

원격 클라이언트에서는 받은 자료를 변경할 수 있고, 변경된 자료를 다시 되돌려 보낼 수도 있다.  다시 자료에 접근하는 로직에 대한 이야기로 돌아가자.


DataSet의 DataTable 객체에서 변경된 행을 찾아내고 변경된 값을 데이터베이스에 기록하기 위해 TableAdapter 객체를 사용할 수 있다.  이런 갱신은 대개 낙관적 동시성(optimistic concurrency)이라 불리는 기술에 의해 보호된다. 

갱신 로직이 DataSet을 갱신하지 않고 있는 동안에 다른 클라이언트로부터의 변경 내역을 체크하기 위해 DataSet에 저장된 원본 자료 값을 사용한다는 뜻이다.  다른 클라이언트부터 변경된 내용이 있다면 갱신된 내용이 겹쳐 쓰여지는 것을 막기 위해 갱신 동작이 실패할 것이다.


DataSet을 사용하는 것은 바람직한 선택이다.  웹서비스 호출로 원격 시스템에 자료를 전송하려 할 때도 DataSet은 역시 좋은 선택이다.  하지만 휴대용 기기처럼 메모리가 제한적인 디바이스에서 GUI에서 자료를 보여주거나 갱신하는 것이 전부라면 데이터베이스를 사용하면서 관계형 데이터베이스의 여러 특성을 지닌 DataSet 같은 무거운 객체를 사용하는 것은 낭비다.


이럴 경우엔 SqlCeResultSet이 제격이다.  SqlCeResultSet은 데이터베이스에 자료를 요청하고 읽고 DataGrid와 같은 GUI 컨트롤에 연결하고 (소스 데이터가 단일 테이블인 경우) 갱신하는 데 사용할 수 있는 객체다.  호출된 서버 측 커서(cursor)를 사용해서 데이터베이스에 직접 작업이 가능하다(DataSet의 DataTable을 사용할 때는 클라이언트 측 커서를 사용한다.).  DataSet의 고급 기능을 사용할 필요가 없다면 가능한 한 SqlCeResultSet을 사용해야 한다.

'Education > Bit 18th' 카테고리의 다른 글

최종프로젝트 문서화 작업 By 용호  (0) 2009.12.31
옴니아 Gps 수신 속도 By 용호  (0) 2009.12.28
프로젝트 소스[1] - 기본 메뉴만 구성  (0) 2009.12.18
프로젝트 구현 계획  (0) 2009.12.16
프로젝트 계획  (0) 2009.12.16

댓글