DATOR

ADO - Application 에서의 DB connection

Document URL : http://www.dator.co.kr/367823
DB Connection 프로그래밍 | Posted on December 06th, 2012 at 01:33 by 밀오 | 조회수 : 11670

대상:  DB 응용 프로그래머 혹은 ADO란 용어에 평소 관심이 있으신 분 


ADO 란?

(ActiveX Data Objects)



프로그래머에게 OLE DB를 객체지향 관점에서 접근하도록 도와주는,

Microsoft사 제공 라이브러리 입니다.


ADO = ActiveX Data Object 입니다.

다들 치를 떨도록 많이 접해보셨을 Active X 인데요,

그 중 data source (또는 DB)에 특화된 객체들이 ADO라고 보시면 됩니다.


OLE DB는 전에 http://www.dator.co.kr/msjung/270084 글로 올린적이 있습니다.

ADO는, 이 OLE DB관련 기술을 클래스로 구현해놓은 것입니다.


이 글에서는, 

ADO Object를 직접 사용해야하는 분들을 위해,

전의 OLE DB 글에서 제대로 다루지 못했던, ADO의 각 객체에 대한 간단한 설명 및 사용시 주의사항을 정리하려고 합니다.


아래 그림은, ADO 와 OLE DB 의 관계를 보여주고 있습니다.


IC38863.gif


ADO 객체


 - 각 객체의 관계도 입니다. 설명은 아래에


ADO Object Model


(출처: http://msdn.microsoft.com/en-us/library/ms675944(v=vs.85).aspx)


 - ADO는 다음 9개의 객체와 4개 Collection 으로 이루어져 있습니다.


객체 와 Collection

설명

Connection 객체

이 객체는, 데이터소스의 고유한 세션을 표현합니다.

Client/Server 데이터베이스 시스템의 경우, 서버의 실제 Network Connection이 될 것입니다.


Provider의 지원 여부에 따라서, 몇몇 Collection, Method, Connection property 는 동작하지 않을 수 있습니다.

Command 객체

데이터소스를 대상으로 실행하는 각각의 명령(SQL 쿼리문과 같은)을  지정하기 위해 사용합니다.

Recordset 객체

이 객체는, 대상 테이블이나 실행한 명령의 결과에 대한 결과값의 모듬을 표현합니다.
모든 Recordset  객체는 Record(행)와 Field(열)으로 구성됩니다.

Record 객체

이 객체는, Recordset 이나 Provider에서 가져온 데이터의 단일 row를 표현합니다.


이 record는, Provider의 종류에 따라서 데이터베이스의 record 일 수 도 있고, 디렉토리나 파일 같은 다른 타입의 객체일 수도 있습니다.

Stream 객체

이 객체는, 텍스트나 이진 데이터의 Stream을 표현합니다.


Stream의 사용 예로, 명령문의 입력으로 들어갈 XML 문서를 Stream을 통해 Load 할 수 도 있고, 쿼리의 결과를 Provider로 부터 Stream을 통해 받을 수도 있습니다.


Stream 객체는 이러한 데이터 Stream을 포함한 Field나 Record를 조작하기 위해 사용합니다.

Parameter 객체

이 객체는, Command 객체와 관련된 Parameter나 관련 인자를 표현합니다.

매개변수가 있는 쿼리나 저장프로시저를 사용할 때 많이 이용합니다.

Field 객체

이 객체는, 일반적인 데이터 타입으로 된 데이터의 열을 표현합니다.

각각의 Field 객체는 Recordset 의 단일 열을 나타냅니다.

Property 객체

이 객체는, Provider에 정의된 ADO 객체의 특성을 표현합니다.

ADO 객체는 두가지 형태의 특성을 지니는데, 각각 내장형과 가변형(dynamic) 입니다.

내장 특성은 ADO안에 구현된 특성으로, 모든 새로운 객체에 즉시 적용됩니다.

Property 객체는 Provider에 의해 정의되는 가변(dynamic) 특성을 위한 데이터 저장소입니다.

Error 객체

Provider와 관련되어 수행된 각각의 작업에 따라 발생한 에러의,

자세한 정보를 포함하고 있는 객체입니다.

Fields collection

Recordset 이나 Record 객체의 모든 Field 객체들을 포함하고 있습니다.

Properties collection

객체의 특정 인스턴스에 대한 모든 Property 객체들을 포함하고 있습니다.

Parameters collection

Command 객체의 모든 Parameter 객체들을 포함하고 있습니다.

Errors collection

각 provider 관련 오류에 따라 생성되는 모든 Error 객체들을 포함하고 있습니다.



(출처: http://msdn.microsoft.com/en-us/library/ms676598(v=vs.85).aspx)




주요 객체 설명


Connection

 - Datasource와 연결을 관리하는 객체


Recordset

 - Datasource의 data와 연결되는 객체입니다.
   실제 동작은 Datasource의 cursor를 가리킵니다.

 - row (Record) 와 column (Field) 의 집합으로 구성됩니다.

 - 같은 Connection에 여러개 생성할 수 있으나, 내부적으로 connection을 새로 생성합니다. 


Command

 - 대상 Datasource 에 실행할 명령을 저장하는 객체

 - 간단한 명령은, Connection이나, Record 객체만으로도 실행할 수 있지만,

   명령을 다시 실행하거나, 명령에 세부 파라미터를 설정하는 등의 작업은, Command 객체로만 가능한 작업입니다.


위 3개 객체만으로도, 간단한 OLEDB 응용프로그램을 작성할 수 있습니다.

Connection 객체를 이용해 접속한뒤,

Command 객체를 이용해 명령을 저장하고, 실행합니다.

Recordset 객체를 이용해서 실행한 명령의 결과를 얻어옵니다.


추가로,

쿼리문에 파라미터를 입력하려면 Parameter 객체를 이용하고,

쿼리 결과를 컬럼별로 얻어오려면 Field 객체를 이용합니다.



주의사항


-  Recordset 인스턴스 관리


명령이 실행되어 Recordset 객체에 결과가 담길 때에,

데이터의 총 크기와 상관없이 바로 실행이 끝나는 것을 볼 수 있습니다.


이는 쿼리의 전체 결과값을 한번에 가져오는 대신,

쿼리 결과를 가리키는 Cursor를 생성한 뒤, 해당 Cursor를 통해 결과값을 조금씩 가져오기(fetch) 때문입니다.


이러한 이유로, 

Command를 실행하면 Cursor가 Server의 메모리를 차지하고 있는 상태가 됩니다.


생성 가능한 최대 Cursor 갯수가 제한되어 있고, (기본값 50),

DB의 각 메모리 또한, 시스템의 Process Memory 크기로 제한됩니다.

때문에, Recordset 인스턴스를 생성해놓고 마냥 방치해 두다간, 성능 저하나 에러가 발생하게 됩니다.


이럴 때엔, 프로그램이 끝난 뒤에 Recordset::Close() 를 호출해주면 메모리가 정리됩니다.

평소엔 문제가 잘 나타나지 않아 디버깅이 쉽지 않습니다. 습관이 중요한 것 같습니다.

(http://msdn.microsoft.com/en-us/library/ms916626.aspx)


Cursor를 잘 이용하면, 부분범위 처리의 이점을 취할 수 있습니다.

예로, 클라이언트 프로그램이라면, 페이지 기능을 쉽게 구현할 수 있습니다.

(웹의 경우엔, 서버와의 접속을 계속 유지하지 않기 때문에, 다른 방식을 사용합니다.)


Tagged :
     

Comments : 0