상세 컨텐츠

본문 제목

ADO에 대한 모든 것

프로그래밍/JAVA

by 라제폰 2009. 1. 30. 17:37

본문


ADO에 대한 모든 것

 

ADO 소개

MDAC (Microsoft Data Access Components)

UDA(Universal Data Access)는 여러 기업 환경의 정보에 접근하는 방법을 제공하기 위한 마이크로소프트의 전략이다. UDA는 다양한 정보 소스에 빠르게 접근할 수 있으며, 관계형 또는 비 관계형 데이터베이스를 모두 접근할 수 있다. 그리고 개발 툴과 개발 언어에 비 독립적이면서도 쉽게 인터페이스를 프로그래밍할 수 있도록 지원한다. 이 기술은 다양한 데이터 소스에 접근할 수 있으며, 쉽게 유지보수할 수 있는 솔루션을 제공하며, 개발 툴, 어플리케이션, 플랫폼 모두에 최상의 선택이 될 것이다.

UDA는 데이터 소스간의 이동에 소요되었던 많은 비용과 시간을 줄여주며, ODBC, RDO, DAO를 포함하는 차기 표준 인터페이스로 예상되고 있다.

MDAC(Microsoft Data Access Components) UDA를 지원하며, ADO(ActiveX Data Objects), Remote Data Service(RDS), OLE DB, ODBC(Open Database Connectivity) 그리고 OLE DB for OLAP을 포함하고 있다.

MDAC은 버전 1.0에서 시작하여 1.5, 2.0, 2.1 그리고 2.5 버전까지 발전되어 왔다. MDAC 1.0 ODBC 3.0, ADO 1.0, ADC(Advanced Data Connector) 1.0 그리고 OLE DB 1.0을 포함하고 있었으며, 1996년에 발표되었다.

MDAC 1.5 ODBC 3.5, ADO 1.0, OLE DB 1.5 그리고 RDS(Remote Data Service) 1.5를 포함하고 있었으며, 97년에 발표되었으며, 여러 번의 Minor 업그레이드(MDAC 1.5, MDAC 1.5a, MDAC 1.5b, MDAC 1.5c, MDAC 1.5d)를 거쳐왔다.

MDAC 2.0 ODBC 3.51, OLE DB 2.0, ADO 2.0, RDS 2.0 그리고 OLE DB for OLAP을 포함하고 있었으며, 98년 말에 발표되었다. MDAC 2.0은 비주얼 스튜디오 6 2 CD에 포함되어져 있다. MDAC 2.1 MDAC 2.0의 기능을 보안하여서 발표되었으며, MS SQL 서버 7.0에 포함되어져 있다.

MDAC을 사용할 때 주의해야 될 점은 MDAC을 포함하고 있는 프로그램을 설치하고 나면 MDAC의 버전이 변경되기 때문에 최신 버전의 MDAC으로 환경을 보전해 주어야 한다. 예를 들어, 비주얼 스튜디오 6.0을 설치했다면 MDAC 2.0으로 변경된다. 그렇기 때문에 비주얼 스튜디오 6.0을 설치한 후에 다시 MDAC 2.1을 설치해 주어야 최신 버전의 MDAC을 사용할 수 있다.

Windows NT 4.0에서 옵션 팩을 다시 설치했다면 MDAC 1.5로 변경된다. 이럴 경우에도 역시 MDAC 2.1을 다시 설치해야 한다.

MDAC 2.5 99년 말에 Windows 2000과 함께 발표될 예정이며, MDAC 2.5 Windows 2000의 시스템 레벨의 구성요소로 만들어졌다. 그렇기 때문에 Windows 2000에서는 MDAC을 별도로 설치할 필요 없이 Windows 2000 운영체제를 설치할 때 함께 설치하면 된다. 그리고 현재 MDAC 2.5에 대한 모습을 보려면 Windows 2000 베타 3를 설치해서 사용하면 된다.

그러면 MDAC에 포함된 5가지 구성요소에 대해서 간략하게 살펴본다.

1.       ODBC - Open Database Connectivity의 약어로서, MS SQL 서버, 오라클(Oracle),인포믹스(Informix), 사이베이스(Sybase), DB2 등의 관계형 데이터베이스에 접속하기 위한 인터페이스 규격이다. ODBC는 마이크로소프트에 의해서 제안되었으며, 현재로서는 대부분의 관계형 데이터베이스의 표준  인터페이스로 사용되고 있다. ODBC에 대응하는 것으로 IBM, 노벨(Novell), 워드 퍼펙 등과 같은 회사들이 연합하여 정의한 데이터베이스 인터페이스로는 IDAPI(Integrated Database Application Programming Interface)가 있다.
 

2.       ADO - ActiveX Data Object의 약어로서, 기존의 DAO(Data Access Object) RDO(Remote Data Object)를 대체하는 데이터 접속 개체이다. ADO에 대한 자세한 내용은 이 장의 2절에서 다루고 있다.
 

3.       OLE DB - Object Linking & Embedding Database의 약어로서, ODBC를 대체하는 기술로 부각되고 있는 마이크로소프트의 기술이다. OLE DB에 대한 자세한 내용은 이 장의 3절에서 다루고 있다.
 

4.       RDS - Remote Data Service의 약어로서, 웹 환경에서 데이터베이스를 조작하기 위한 마이크로소프트의 기술인 ADC(Advanced Database Connector)의 다음 버전이다. RDS에 대한 자세한 내용은 제 6 User Interface 프로그래밍에서 다루고 있다.
 

5.       OLEDB for OLAP - Object Linking & Embedding Database for On Line Analytic Processing의 약어로서, MS SQL 서버의 일부인 Decision Support Service(코드명 Plato, OLAP Server)의 데이터를 조작하기 위한 기술이다.

이제 ADO OLE DB에 대해서 자세히 살펴 보도록 하자.

ActiveX Data Object

ActiveX Data Object(ADO)는 마이크로소프트의 새로운 데이터 접속 개체로서 대부분의 데이터 형태를 접속해서 처리할 수 있도록 지원하고 있다. ADO는 로컬 데이터베이스 처리에 주로 사용된 DAO (Data Access Object)와 관계형 데이터베이스 처리에 주로 사용된 RDO(Remote Data Object)의 대부분의 기능을 지원하고 있으며, 기존의 데이터 관련 개체에서 지원하지 못하던 새로운 기능들도 추가로 지원하고 있다.

ADO MDAC(Microsoft Data Access Component)에 포함되어져서 배포되며, 비주얼 베이직 6에는 기본으로 ADO 1.5가 탑재되어 배포된다. ADO 1.0 버전은 RDO의 부분 기능만을 지원했으며, 주로 웹 프로그래머들에 의해서 사용되었다. 대부분의 웹 프로그래머들은 CGI(Common Gateway Interface) PERL(Practical Extraction and Report Language)을 이용해서 데이터베이스 관련 기능을 처리했으며, 일부 마이크로소프트의 SQL 서버를 사용하는 웹 개발자들은 IDC(Internet Database Connector)를 사용해서 데이터베이스를 처리했다. 하지만, IDC의 기능이 미비해서 웹 어플리케이션을 개발하는데 어려움이 많았으며, 이런 상황에서 ADO의 출현은 웹 프로그래머들에게 희소식이었다. 이렇게 ADO는 웹 개발자들에 의해서 처음 사용되어져 왔으며, ADO 1.5 버전은 DAO RDO의 대부분의 기능을 지원하게 되었고, 비주얼 스튜디오 6에 포함되었다. DAO RDO의 기능에 새로운 기능을 추가한 ADO 2.0 98년 말에 발표되었으며, 마이크로소프트 SQL 서버 7.0에 포함되었다. 그리고 2000 2월에 발표된 Windows 2000에 포함된 ADO 2.5 Record Stream이라는 새로운 개체를 추가해서 새로운 모습으로 발표되었다.


[
그림] ADO DAO/RDO 구조의 비교

ADO는 기존의 데이터 관련 개체에 비해서 다음과 같은 장점들을 가지고 있다.

1.       적은 메모리를 요구하기 때문에 서버의 자원을 적게 사용한다.

2.       인터넷과 인트라넷을 통한 데이터 접근에 최적화 되도록 구현되었기 때문에 네트워크에 부하를 적게 준다.

3.       배치 커서(Batch Cursor), 클라이언트 커서(Client-Side Cursor), 서버 커서(Server-Side Cursor)를 포함해서 복합적인 커서를 지원한다

ADO를 이용하면 DAO RDO 보다는 간단하게 어플리케이션을 구축할 수 있다. 이유는 DAO RDO 는 계층적 구조로 이루어진 반면에 ADO는 내부의 개체들이 각각 독립적으로 존재하기 때문에 다른 개체와의 연결 없이도 데이터를 처리할 수 있기 때문이다. 하지만, 그런 ADO의 구조로 인해 적절한 방법을 선택해서 어플리케이션을 구축하기 위해서는 많은 노력과 지식이 필요하게 된다.

ADO는 마이크로소프트 비주얼 베이직, 엑티브 서버 페이지(Active Server Pages), 마이크로소프트 비주얼 C++, 마이크로소프트 엑세스(Access), 마이크로소프트 엑셀(Excel), 마이크로소프트 워드(Word) 그리고 ADO OLE DB를 지원하는 여러 개발 환경에서 사용할 수 있다.

ADO는 확장된 형태의 ADOX ADO MD를 지원한다. ADOX Data Definition Language Security를 처리하는 ADO의 확장된 형태로서 테이블과 저장 프로시저 같은 스키마 개체를 조작하고 개체에 대한 권한을 부여(Grant)하거나 회수(Revoke)한다. 비주얼 베이직과 같은 개발 도구에서 ADOX를 사용하려면 형식 라이브러리를 참조해야 한다. ADOX의 형식 라이브러리는 "Microsoft ADO Ext. for DDL and Security"이며, ADOX 라이브러리 파일 이름은 Msadox.dll이다. 그리고 프로그램 ID (ProgID) "ADOX"이다. 다음 그림은 비주얼 베이직 참조 메뉴에서 ADOX를 참조하는 화면이다.


[
그림] ADOX 참조 화면

ADO MD MD Multidimensional Data의 약어이며, ADO MD OLAP 데이터와 같은 다차원의 스키마 또는 큐브(Cube)를 조회하거나 결과를 검색하기 위해 사용되는 구성요소이다. ADO MD를 사용하기 위해 OLE DB Provider OLAP(On Line Analytic Processing)을 지원하는 Multidimensional Data Provider(MDP)이어야 한다. 비주얼 베이직에서 ADO MD를 사용하려면 ADO MD 형식 라이브러리를 참조해야 한다. ADO MD의 라이브러리 파일 이름은 msadomd.dll이며, 프로그램 ID(ProgID) "ADOMD"이다. 다음 그림은 비주얼 베이직 참조 메뉴에서 ADO MD를 참조하는 화면이다.


[
그림] ADO MD를 참조하는 화면

ADOX ADO MD에 대한 내용은 이 책에서 다루지 않으며, 자세한 정보는 Windows 2000 Microsoft Platform SDK Data Access Services를 참조한다.

ADO 개체 모델

ADO DAO RDO처럼 계층적 구조를 가지고 있다. 하지만, 각각의 개체들이 독립적으로 존재할 수 있기 때문에 상위 개체인 Connection 개체가 존재하지 않더라도 Recordset 개체만으로도 데이터베이스에 접속해서 테이블의 레코드를 가져올 수 있다. 이런 이유로 인해서 ADO는 랜 환경의 개발자들 보다는 웹 환경의 개발자들에 의해서 먼저 사용되어져 왔다.

ADO의 개체 모델은 다음과 같다.


[
그림] ADO 개체 모델

ADO 개체 모델은 개발자들이 데이터에 접근하기 위해서 사용하는 세 가지의 핵심 개체인 Connection, Command, Recordset Field, Property, Parameter 등의 개체들로 구성되어져 있으며, ADO 2.5에서 Record 개체와 Stream 개체가 추가되었다.

비주얼 베이직에서 ADO를 사용하기 위해서는 프로젝트 메뉴의 참조(References)에서 Microsoft ActiveX Data Object 2.5 Library (msado15.dll)을 선택해야 한다.


[
그림] ADO를 참조하는 화면

비주얼 베이직 프로젝트 메뉴의 참조(References)에서 ADO를 추가했다면, 개체 찾아보기(Object Browser, F2)에서 ADO 개체에 관련된 정보를 볼 수 있을 것이다.


[
그림] 개체 찾아보기(Object Browse)

이제 ADO를 사용하기 위해서 ADO를 설치해 보도록 하자.

Connection

 

 

Connection 개체는 ADO의 상위 레벨에 존재하는 개체로서 데이터와의 연결을 제공하는 개체이다.


[
그림] Connection 개체

ADO DAO RDO와는 달리 Connection 개체가 없이 Recordset 개체를 생성할 수도 있지만, 여러 개의 Recordset 개체를 빈번히 사용할 경우에는 하나의 Connection 개체를 생성한 후에 재사용하는 것이 보다 효율적이다. 예를 들어, 웹 환경에서 ADO를 사용할 경우에는 Recordset 개체를 사용해서 직접 데이터베이스에 접속하는 것이 효율적이다. 이유는 Connection 개체를 사용해서 데이터베이스에 연결한 다음에 먼저 생성한 Connection 개체를 통해서 Recordset 개체를 생성하려면 인터넷을 통해서 데이터베이스에 두 번 접속해야 되기 때문이다. 인터넷이라는 환경 때문에 Recordset 개체로 직접 데이터베이스에 접속하는 것이 보다 효율적이다. 그런 반면에 랜 환경에서는 Connection 개체를 먼저 생성하고 생성한 Connection 개체를 통해서 Recordset 개체를 생성하는 것이 보다 더 효율적이다. 이유는 Recordset 개체로 직접 데이터베이스에 접속할 경우에 서버에서는 디폴트 Connection 개체를 자동으로 생성한 다음에 생성한 디폴트 Connection 개체를 통해서 Recordset 개체를 생성하고 디폴트 Connection 개체를 제거하는 작업을 수행한다. 그렇게 되면 서버 측에는 많은 부하가 걸리게 된다. 랜 환경에서는 이런 서버 측의 부하로 인해서 Connection 개체를 생성한 다음 생성한 Connection 개체를 전역 변수로 선언하고 응용 프로그램에서는 생성한 Connection 개체를 사용해서 Recordset 개체를 생성하는 것이 보다 더 효율적이게 된다.

[예제] Connection 개체 생성

새로운 표준 EXE 프로젝트를 시작하고 폼에 CommandButton을 추가한 다음에 다음 코드를 기술한다.


[
그림] Connection 개체 생성 폼

Private Sub cmdConnection_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset

   adoCn.Open "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;" & _
         "User ID=sa;Password="

   adoRs.Open "Authors", adoCn

   'adoRs
를 사용하는 코드 기술

   adoRs.Close

   adoRs.Open "Titles", adoCn

   'adoRs
를 사용하는 코드 기술

   adoRs.Close

   Set adoRs = Nothing
   Set adoCn = Nothing
End Sub

참고

위의 코드에서 ADO Connection 개체를 사용하기 위해서 변수의 데이터 형식을 ADODB.Connection 이라고 선언했다. 비주얼 베이직에서 ADO에 대한 참조를 프로젝트 메뉴의 참조에서 설정했기 때문에 선언문에서 ADODB를 제외하고 Connection 이라고 선언해도 무관하다. 만약 한 프로젝트 내에서 DAO(Data Access Object) ADO(ActiveX Data Object)를 함께 사용하고 있다면 DAO Recordset ADO Recordset의 구별이 모호하기 때문에 ADODB를 반드시 기술해야 하며, 그 외의 경우에는 Connection 만 기술해도 된다.

위의 코드에서 Provider는 사용할 OLD EB Provider를 지정하는 것이며, Data Source는 데이터베이스가 설치된 서버를 지정하는 것이다. (local)은 현재 응용 프로그램이 실행되고 있는 컴퓨터를 가리키는 것이며, 일반적으로 다른 개발자와 공유를 해야 될 필요가 있는 소스는 컴퓨터의 이름보다는 (local)이라고 기술하는 것이 좋다. Initial Catalog는 사용할 데이터베이스를 지정하는 것이며, User ID는 데이터베이스에 접속 권한을 가진 데이터베이스의 사용자 계정을 지정하는 것이다. 마지막으로 Password는 사용자의 암호를 지정하는 것이며, 사용자 계정의 암호가 없다면 지정하지 않아도 무관하다.

Recordset 개체를 여러번 생성해야 될 경우에 Recordset 개체를 생성할 때마다 데이터베이스에 접속하는 것 보다는 하나의 Connection 개체를 생성한 다음에 Recordset 개체의 ActiveConnection 속성에 이미 생성된 Connection 개체를 지정하고 Recordset 개체를 생성하는 것이 보다 효율적이다.

Connection 개체의 속성

속성

설명

기본 값

데이터 형식

Attributes

Connection 개체의 트랜잭션 속성을 읽기, 쓰기할 때 사용 (읽기/쓰기)

0

Long

CommandTimeout

명령어가 결과를 반환할 때까지 대기하는 시간 (초 단위) (읽기/쓰기)

30

Long

ConnectionString
(
디폴트 속성)

데이터 원본에 접속하기 위해서 사용하는 문자열 (읽기/쓰기)

없음

String

ConnectionTimeout

Connection 개체가 데이터에 접속할 때까지 대기하는 시간 (초 단위) (읽기/쓰기)

15

Long

CursorLocation

서버 커서(Server-Side Cursor) 또는 클라이언트 커서(Client-Side Cursor)를 지정 (읽기/쓰기)

Provider에 따라 기본 값이 다름, 일반적으로 서버 커서(adUseServer)

CursorLocationEnum

DefaultDatabase

현재 Connection의 기본 데이터베이스를 읽기, 쓰기할 때 사용 (읽기/쓰기)

없음

String

IsolationLevel

현재 Connection에 대한 Isolation Level을 읽기, 쓰기할 때 사용 (읽기/쓰기)

adXactUnspecified

IsolationLevelEnum

Mode

현재 Connection의 접근 권한에 대한 값을 읽기, 쓰기할 때 사용 (읽기/쓰기)

adModeUnknown

ConnectModeEnum

Properties

데이터 Provider에 대한 프로퍼티 개체들의 컬렉션 (읽기 전용)

없음

Properties

Provider

현재의 세션에 대한 OLE DB Provider를 읽기, 쓰기할 때 사용 (읽기/쓰기)

MSDASQL

String

State

현재 Connection의 상태를 반환 (읽기 전용)

adStateClosed

Long

Version

ADO의 버전을 반환 (읽기 전용)

없음

String

이제 각 속성에 대해 하나씩 알아보도록 하자.

 

 

Attributes 속성

Attributes 속성은 개체의 트랜잭션 특성을 나타내는 속성이며, Long 타입의 값을 Read/Write 할 수 있다. 이 값은 하나 이상의 XactAttributeEnum(기본값 0)의 합을 가진다.

상수

설명

adXactCommitRetaining

Commit 보류를 수행한다. CommitTrans 수행 후에 자동으로 새로운 트랜잭션이 시작됨을 보장한다.

adXactAbortRetaining

RollBack 보류를 수행한다. RollbackTrans 수행 후에 자동으로 새로운 트랜잭션이 시작됨을 보장한다.

이 속성은 모든 Provider가 지원하는 것은 아니다. 두개의 값을 묶어서 사용할 수 있다.
adoCn.Attributes = adXactCommitRetaining And adXactAbortRetaining

[예제]

이 예제는 Connection 개체의 Attributes 속성 값을 나타낸다.

Private Sub cmdAttributes_Click()
   Dim adoCn As New ADODB.Connection
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User ID=sa;Password=; "

   adoCn.Open strConn

   ' Connection
개체의 Attributes 속성을 Display 한다.
   Debug.Print "Connection
개체의 Attributes 속성= " & adoCn.Attributes

   adoCn.Close

   Set adoCn = Nothing
End Sub

 

 

CommandTimeout 속성

CommandTimeout 속성은 명령(Command)을 실행하는 동안 실행이 제대로 되지 않으면 얼마나 오랫동안 기다렸다가 실행을 중지하고 오류를 발생시킬지를 설정하는 속성이다. 이 값은 Read/Write 가능하며 단위는 초이다. 디폴트 값은 30초 이다.
CommandTimeout
속성에 설정된 시간 동안 Execute 메서드의 결과가 반환되지 않으면, ADO는 명령의 실행을 중지시키고 오류를 발생시킨다. 만약 네트워크의 상태가 좋지 않거나 대량의 데이터를 처리하는 작업일 경우에는 이 값을 0으로 설정하면, 명령이 수행될 때까지 무한 대기하게 된다. 하지만, 부득이한 경우를 제외하고는 0으로 설정하는 것은 피하는 것이 좋다. 일반적인 경우에는 디폴트 값(30)을 사용하는 것이 권장된다.

Connection 개체의 CommandTimeout 속성의 설정 값은 Command 개체의 CommandTimeout 속성 값에 영향을 미치지 못한다. 그 이유는 Connection 개체의 CommandTimeout 속성은 Command 개체의 CommandTimeout 속성에 상속되지 않기 때문이다.

CommandTimeout 속성은 데이터와의 연결이 이루어진 후에도 Read/Write가 가능하다.

[예제]

Private Sub cmdCommandTimeout_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   adoCn.Open strConn

   ' CommandTimeout
속성을 설정한다.
   adoCn.CommandTimeout = 10

   Set adoRs = adoCn.Execute("Select * from Authors")

   Do While Not adoRs.EOF
      Debug.Print adoRs(0)

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

위의 예제에서는 SQL 문장이 수행되는 시간이 15초 미만이기 때문에 별다른 현상을 볼 수 없을 것이다. 그러나 CommandTimeout 속성을 1로 설정하고 1초를 초과하는 작업을 수행하면 다음과 같은 오류 메시지를 볼 수 있다.


[
그림] CommandTimeout 속성에 설정된 시간을 초과할 경우에 발생하는 오류 메시지

 

 

ConnectionString 속성


[
그림] ADOX 참조 화면

ConnectionString은 데이터베이스에 접속하기 위한 정보들을 지정하는 속성이며, 이 값에 따라 ODBC 드라이버를 사용하게 될지, OLE DB Provider를 사용하게 될지를 결정하며, 접속할 데이터베이스와 서버, 그리고 접속 권한을 가진 사용자 ID와 암호를 지정할 수 있다.

[예제]

접속 대상

ConnectionString

SQL 서버 Pubs 데이터베이스(ODBC 드라이버 사용)

"Driver={SQL Server};Server=(local);Database=Pubs;UID=sa;PWD="

SQL 서버 Pubs 데이터베이스 (OLE DB Provider 사용)

"Provider=Sqloledb;Data Source=(local);Initial Catalog=Pubs;" & _"User ID=sa;Password="

SQL 서버 Pubs 데이터베이스(OLE DB Provider 사용)

"Provider=SQLOLEDB.1;Persist Security Info=False;User ID=sa;" & _"Initial Catalog=Pubs;Data Source=Chris"
여기에서 Chris SQL 서버가 설치된 컴퓨터의 이름이다.

오라클 서버 Oracle73(OLE DB Provider 사용)

"Provider=MSDAORA.1;User ID=scott/tiger;" & _"Data Source=Oracle73;Persist Security Info=False"

엑세스 Nwind.mdb(OLE DB Provider 사용)

"Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\NWind.mdb"

참고로 오라클 데이터베이스에 접속할 경우에는 오라클에서 제공하는 클라이언트 도구인 SQL*Net을 설치한 후에 Easy Configuration으로 데이터베이스의 Alias를 생성한 다음, 윈도우 제어판의 ODBC32에서 DSN을 생성하든지, OLE DB Provider를 통해서 데이터베이스에 접속하도록 한다. 오라클에서 제공되는 SQL*Net의 설정 방법에 대해서는 제 8장 이기종 데이터베이스 접속에서 자세히 다루고 있다.

[예제]

Private Sub cmdConnectionString_Click()
   Dim adoCn As New ADODB.Connection

   ' Data Source Name(DSN)
없이 ODBC 드라이버로 연결하기
   adoCn.ConnectionString = "Driver={SQL Server};Server=(local);" & _
         "Database=Pubs;UID=sa;PWD="

   adoCn.Open

   adoCn.Close

   ' DSN
을 이용하여 연결하기
   adoCn.ConnectionString = "DSN=Pubs"

   adoCn.Open

   adoCn.Close

   ' OLE DB
를 이용하여 연결하기
   adoCn.ConnectionString = "Provider=Sqloledb;Data Source=(local);" & _
         "Initial Catalog=Pubs;User ID=sa;Password="
   adoCn.Open

   adoCn.Close

   Set adoCn = Nothing
End Sub

위의 코드는 개체 변수를 생성할 때 Early Binding으로 처리했으며, Connection 개체의 Open 메서드의 매개변수로 사용자 ID와 암호를 지정하지 않고, ConnectionString 속성에 사용자 ID와 암호를 지정했다. 위의 코드에서 알 수 있듯이, 사용자 ID와 암호는 ConnectionString 속성에서 지정할 수도 있고, Open 메서드의 매개변수로도 지정할 수 있는 선택적인 사항이다.

DSN(Data Source Name)을 작성하는 방법에 대해서는 제 8장 이기종 데이터베이스 접속에서 다루고 있다.

 

 

ConnectionTimeout 속성

비주얼 베이직에서 ADO를 사용하기 위해서는 프로젝트 메뉴의 참조(References)에서 Microsoft ActiveX Data Object 2.5 Library (msado15.dll)을 선택해야 한다.

ConnectionTimeout 속성은 데이터베이스에 연결이 이루어지기를 얼마나 오랫동안 기다렸다가 실행을 중지하고 오류를 발생시킬지를 설정하는 속성이다. 이 값은 Read/Write 가능하며 단위는 초이다. 기본 값은 15초 이다.

ConnectionTimeout 속성을 설정한 후 이 시간 동안 데이터베이스와 연결이 이루어지지 않으면, ADO는 실행을 중지시키고 오류를 발생시킨다. 만약 네트워크의 상태가 좋지 않아서 이 값을 0으로 설정하면, 연결이 이루어질 때까지 무한 대기하게 된다. 하지만, 부득이한 경우를 제외하고는 0으로 설정하는 것은 피하는 것이 좋다.

ConnectionTimeout 속성은 데이터베이스와 연결되었거나 연결되지 않았거나, Read/Write 가능하다.

[예제]

Private Sub cmdConnectionTimeout_Click()
   Dim adoCn As New ADODB.Connection
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adoCn.ConnectionTimeout = 10

   adoCn.Open strConn

   adoCn.Close

   Set adoCn = Nothing
End Sub

위의 예제는 ConnectionTimeout 속성을 10으로 설정하는 예이다. 만약 네트워크의 상태가 좋지 않거나 서버 측에서 문제가 발생해서 10초 이내에 데이터베이스에 접속하지 못하면 다음과 같은 오류가 발생한다.


[
그림]ConnectionTimeout 화면

 

 

CursorLocation 속성

CursorLocation 속성은 커서 엔진이 생성될 위치를 지정하거나 현재 CursorLocation 설정 값을 읽어 올 수 있는 속성이다.

상수

설 명

adUseNone

0

커서 서비스를 사용하지 않겠다는 설정으로 단지 이전 버전과의 호환성을 위해서 제공되는 값이다.

adUseServer

2

디폴트 값이며, 데이터 Provider 또는 드라이버가 지원하는 커서이다. 서버 커서는 유연하고 다양한 기능을 제공하지만, 클라이언트 커서가 지원하는 Disconnected Recordset과 같은 몇몇 기능을 제공하지 못한다.

adUseClient

3

로컬 커서 라이브러리에 의해서 제공되어지는 클라이언트 커서. 로컬 커서 엔진은 드라이버가 지원하지 않는 유용한 기능들을 지원하는 경우도 있다.

CursorLocation 속성은 Connection 개체와 Recordset 개체가 가지고 있는 속성이며, Connection 개체와 Recordset 개체가 데이터 소스에 연결되기 전에는 읽기/쓰기가 모두 가능하며, 연결된 후에는 읽기 전용이다.

특별히, RDS(Remote Data Service)에서 클라이언트 측의 Recordset(ADOR) 개체나 Connection 개체를 사용하기 위해서는 adUserClient를 사용해야만 한다.

Recordset 개체의 CursorLocation 속성은 지정하지 않으면 Connection 개체의 CursorLocation 속성의 설정 값을 상속 받는다. 그리고 Recordset 개체는 ActiveConnection으로 지정된 Connection 개체의 CursorLocation 속성의 값과 다른 CursorLocation 값을 사용할 수도 있다. 그래서 Connection 개체는 서버 커서를 사용하고 Recordset 개체는 클라이언트 커서를 사용하도록 설정할 수 있다.

[예제]

Private Sub cmdCursorLocation_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String
   Dim strMessage As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   adoCn.CursorLocation = adUseClient
   adoCn.Open strConn

   adoRs.Open "Employee", adoCn, , , adCmdTable

   Do While Not adoRs.EOF
   Debug.Print "Employee: " & adoRs!lName & " (" & adoRs.RecordCount & _
         "
중의 " & adoRs.AbsolutePosition & "번째 레코드 )"

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

위의 예제에서 Recordset 개체의 AbsolutePosition 속성은 현재 레코드의 물리적인 순서를 알려주는 속성으로 Recordset 개체의 CursorLocation 속성과 CursorType에 따라 사용 가능 여부가 달라진다. 이에 대한 자세한 내용은 제 8 CursorLocation 속성과 제 9 CursorType 속성에서 다루고 있다.

참고

위의 예제에서 Recordset 개체는 데이터베이스에 직접 연결된 것이 아니라, Connection 개체를 사용해서 데이터베이스에 접속한 후, 생성한 Connection 개체를 이용해서 Recordset 개체를 연결하고 Recordset 개체를 통해서 테이블의 레코드를 읽어 온다. 인터넷이 아닌 랜(LAN, Local Area Network) 환경이라면 위의 예제처럼 비주얼 베이직 프로젝트의 시작부분(Sub Main 함수)에서 Connection 개체를 생성하고, 이것을 프로젝트 내에서 사용하는 것이 보다 효율적이다. 이유는 Recordset 개체를 직접 데이터베이스에 연결할 경우에는 서버 측에서 디폴트 Connection 개체를 생성하고 생성한 Connection 개체를 통해서 Recordset 개체를 생성한 후, Connection 개체는 소멸되는 작업이 내부적으로 이루어지기 때문에 서버에는 많은 부하가 걸리게 된다. 웹 환경이라면 이런 서버 측의 부하보다 네트워크 상의 부하가 더 크기 때문에서 서버 측의 부하를 감수하고 Recordset 개체를 사용해서 직접 데이터베이스에 접속하는 방식이 사용된다. 하지만, 랜 환경이라면 전역 Connection 개체를 사용해서 필요한 Recordset 개체를 사용하는 것이 보다 더 효율적이다.

 

 

DefaultDatabase 속성

DefaultDatabase 속성은 Connection 개체의 디폴트 데이터베이스를 지정하는 속성이다. DefaultDatabase 속성을 지정해서 작업을 수행하려면 Provider가 하나의 Connection 개체에 여러 개의 데이터베이스를 할당해서 사용할 수 있도록 지원해야만 한다. 몇몇 Provider는 하나의 Connection 개체에 오직 하나만의 데이터베이스를 할당할 수 있기 때문에 DefaultDatabase 속성을 변경할 수 없게 된다.

Provider가 이를 지원하지 않을 경우에는 오류가 발생하거나 빈 문자열을 반환한다.

이 속성은 CursorLocation이 클라이언트인 Connection 개체에서는 지원되지 않는다.

[예제]

다음 예제는 디폴트 데이터베이스를 지정하지 않고 Connection 개체를 데이터베이스에 연결한 후에 디폴트 데이터베이스를 지정하고 Connection 개체로부터 Recordset 개체를 생성하는 예이다.

Private Sub cmdDefaultDatabase_Click()
   Dim adoCn1 As New ADODB.Connection
   Dim adoCn2 As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset

   ' Microsoft ODBC Provider
사용
   adoCn1.ConnectionString = "Driver={SQL Server};" & _
         "Server=(local);UID=sa;PWD="
   adoCn1.Open
   adoCn1.DefaultDatabase = "Pubs"

   adoRs.Open "Authors", adoCn1

   adoRs.Close
   Set adoRs = Nothing

   adoCn1.Close
   Set adoCn1 = Nothing

   ' Microsoft SQL Server Provider
사용
   adoCn2.ConnectionString = "Provider=sqloledb;" & _
         "Data Source=(local);User ID=sa;Password="
   adoCn2.Open
   adoCn2.DefaultDatabase = "Pubs"

   adoRs.Open "Authors", adoCn2

   adoRs.Close
   Set adoRs = Nothing

   adoCn2.Close
   Set adoCn2 = Nothing
End Sub

 

IsolationLevel 속성

Connection 개체의 IsolationLevel을 지정하는 속성이다. 이 속성은 아래의 IsolationLevelEnum 값들을 지정할 수 있다.

상수

설명

adXactUnspecified

-1

Provider가 특별히 지정된 IsolationLevel을 사용하지 않을 경우, IsolationLevel을 명시하지 않을 때 사용하는 값이다.

adXactChaos

16

디폴트 값이며, 분리된 트랜잭션으로부터 발생하는 Commit되지 않은 변경을 반영하지 않는 IsolationLevel을 지정하는 값이다.

adXactBrowse 또는 adXactReadUncommitted

256

한 트랜잭션에서 다른 트랜잭션에서 Commit되지 않은 변경을 읽을 수 있는 IsolationLevel을 지정하는 값이다.

adXactCursorStability 또는 adXactReadCommitted

4096

기본값, 한 트랜잭션에서 다른 트랜잭션에서 Commit된 변경에 대해서만 읽을 수 있는 IsolationLevel을 지정하는 값이다.

adXactRepeatableRead

65536

한 트랜잭션에서 다른 트랜잭션에서 수행한 변경을 읽을 수는 없지만, 새로운 Recordset으로 생성할 수는 있는 값이다.

adXactIsolated 또는 adXactSerializable

1048576

한 트랜잭션이 다른 트랜잭션으로부터 완전히 독립적임을 나타내는 값이다.

IsolationLevel 속성은 Connection 개체의 Isolation Level을 지정하기 위해서 사용된다. IsolationLevel 속성은 Read/Write가 가능하며, 값이 설정되면 새로운 BeginTrans 메서드에서부터 반영된다. 만약 개발자가 지정한 Isolation Level이 부적절한 경우에는 Provider가 보다 높은 레벨의 Isolation Level로 자동으로 변경한다.

Remote Data Service를 사용할 때, 클라이언트 커서를 사용하게 되면, IsolationLevel 속성은 adXactUnspecified 값으로만 지정할 수 있다. 이유는 클라이언트 캐쉬에서 Disconnected Recordset 개체를 사용하게 되면 다중 사용자의 문제에 부딪히게 되기 때문이다. 예를 들어, 두 명의 사용자가 동시에 동일한 레코드를 수정하려고 시도한다면, Remote Data Service는 먼저 요청한 한 사용자의 수정만 받아 들이고, 두 번째 사용자의 요청은 오류로 처리하기 때문이다.

실제 개발에 있어서 SQL 서버의 Isolation Level Connection 개체로 조작하는 경우는 그리 많지 않으며, 부득이하게 Dirty Page를 읽어야만 하는 경우 이외에는 거의 사용하지 않는다고 볼 수 있다. 여기에서 Dirty Page는 다른 트랜잭션에서 아직 Commit하지 않은 상태에 있는 데이터의 변경된 부분을 말하는 것이다.

[예제]

다음 예제는 IsolationLevel 속성과 Mode 속성을 함께 사용하는 예이다. Connection 개체의 Mode 속성을 adModeShareExclusive로 설정하고 IsolationLevel 속성을 adXactIsolated로 설정한 다음, 트랜잭션을 시작해서 특정 필드의 값을 변경하고, 코드의 마지막 부분에서 모든 트랜잭션을 Rollback 하는 예이다.

Private Sub cmdIsolationLevel_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   '
다른 사용자가 Connection 개체를 연결하지 못하도록 설정한다.
   adoCn.Mode = adModeShareExclusive
   '
다른 트랜잭션으로부터 독립되도록 설정한다.
   adoCn.IsolationLevel = adXactIsolated
   ' Connection
개체를 연결한다.
   adoCn.Open strConn

   adoRs.CursorType = adOpenDynamic
   adoRs.LockType = adLockPessimistic
   adoRs.Open "Titles", adoCn, , , adCmdTable

   adoCn.BeginTrans

   'Connection mode
를 보여준다.
   If adoCn.Mode = adModeShareExclusive Then
      MsgBox "Connection mode is exclusive."
   Else
      MsgBox "Connection mode is not exclusive."
   End If

   'isolation level
을 보여준다.
   If adoCn.IsolationLevel = adXactIsolated Then
      MsgBox "Transaction is isolated."
   Else
      MsgBox "Transaction is not isolated."
   End If

   'Type
값이 "psychology"이면 "self_help"로 변경
   Do Until adoRs.EOF
      If Trim(adoRs!Type) = "psychology" Then
         adoRs!Type = "self_help"
         adoRs.Update
      End If

      adoRs.MoveNext
   Loop

   'Recordset
개체의 현재 데이터를 보여준다.
   adoRs.Requery
   Do While Not adoRs.EOF
      Debug.Print adoRs!Title & " - " & adoRs!Type

      adoRs.MoveNext
   Loop

   '
원래의 데이터를 복구한다.
   adoCn.RollbackTrans

   'Recordset
개체의 복구된 데이터를 보여준다.
   adoRs.Requery

   Do While Not adoRs.EOF
      Debug.Print adoRs!Title & " - " & adoRs!Type

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

 

 

Mode 속성

Mode 속성은 Connection 개체 내에서 데이터를 수정할 권한에 대한 값이며, 다음과 같은 ConnectModeEnum 값 중 하나를 설정하거나 반환한다.

상수

설명

adModeUnknown

0

디폴트 값이며, 권한이 아직 설정되지 않은 상태를 나타낸다.

adModeRead

1

읽기 전용 권한을 나타낸다.

adModeWrite

2

쓰기 전용 권한을 나타낸다.

adModeReadWrite

3

읽기/쓰기 권한을 나타낸다.

adModeShareDenyRead

4

다른 사용자가 읽기 권한으로 Connection 개체를 연결하는 것을 막는다.

adModeShareDenyWrite

8

다른 사용자가 쓰기 권한으로 Connection 개체를 연결하는 것을 방지한다.

adModeShareExclusive

12

다른 사용자가 Connection 개체를 연결하지 못하도록 막는다.

adModeShareDenyNone

16

다른 사용자가 어떤 권한으로도 Connection 개체를 연결하지 못하도록 막는다.

Mode 프로퍼티는 Connection이 닫혀져 있을 때에만 수정할 수 있다.

RDS(Remote Data Service)를 사용할 때에는 클라이언트 커서와 함께 Mode 속성은 adModeUnknown 만을 지정할 수 있다.

 

Properties 속성

데이터 Provider에 대한 속성 개체들의 컬렉션으로 읽기 전용이다. 이 속성은 Provider에 대한 많은 정보를 제공하며, 개발자들은 Provider에 따라서 지원되는 기능이 다르기 때문에 개발에 필요한 기능이 Provider에 의해서 제공되는지를 사용하기 전에 먼저 확인해야 한다.

[예제]

다음 예제는 SQL Server ODBC Provider에 대한 정보를 직접 실행창에 보여주는 예이다.

Private Sub cmdProperties_Click()
   Dim adoCn As New ADODB.Connection
   Dim strConn As String
   Dim i As Integer

strConn = "Driver={SQL Server};Server=(local);" & _
   "Database=pubs;UID=sa;PWD=;"

adoCn.Open strConn

   For i = 0 To adoCn.Properties.Count - 1
      Debug.Print adoCn.Properties(i).Name & " : "; adoCn.Properties(i).Value
   Next i

   adoCn.Close
   Set adoCn = Nothing
End Sub

실행 결과는 다음과 같다.

Current Catalog : pubs
Active Sessions : 0
Asynchable Commit : False
Catalog Location : 1
Catalog Term :
데이터베이스
Catalog Usage : 7
Column Definition : 1
NULL Concatenation Behavior : 0
Data Source Name :
Read-Only Data Source : False
DBMS Name : Microsoft SQL Server
DBMS Version : 07.00.0699
GROUP BY Support : 2
Heterogeneous Table Support : 0
Identifier Case Sensitivity : 8
Maximum Index Size : 900
Maximum Row Size : 8060
Maximum Row Size Includes BLOB : False
Maximum Tables in SELECT : 32
Multiple Storage Objects : False
Multi-Table Update : False
NULL Collation Order : 4
OLE Object Support : 1
ORDER BY Columns in Select List : False
Prepare Abort Behavior : 2
Prepare Commit Behavior : 2
Procedure Term :
저장 프로시저
Provider Name : MSDASQL.DLL
OLE DB Version : 02.00
Provider Version : 2.50.3719.9
Quoted Identifier Sensitivity : 8
Schema Term :
소유자
Schema Usage : 31
SQL Support : 267
Structured Storage : 1
Subquery Support : 31
Isolation Levels : 1118464
Isolation Retention : 0
Table Term :
테이블
User Name : dbo
Pass By Ref Accessors : True
Transaction DDL : 8
Asynchable Abort : False
Data Source Object Threading Model : 1
Output Parameter Availability : 4
Persistent ID Type : 4
Multiple Parameter Sets : True
Rowset Conversions on Command : True
Multiple Results : 1
Provider Friendly Name : Microsoft OLE DB Provider for ODBC Drivers
Connection Status : 1
Server Name : CHRIS
Open Rowset Support : 0
Accessible Procedures : True
Accessible Tables : True
Integrity Enhancement Facility : True
Outer Join Capabilities : 127
Stored Procedures : True
Driver Name : SQLSRV32.DLL
Driver Version : 03.70.0690
Driver ODBC Version : 03.51
Like Escape Clause : Y
Special Characters : #$?
걗깂뀊뇠뎷땶뜋룓몤뱮븭뿕솞썫씆윝、$ø??굉낫독렇뭔뻤슭오좌쳐탬픽?盖誥國喫戇倆厘描白繃嗇飡宸臆預隅膺狀穽增彩充坂沆樺詰?
Max Columns in Group By : 0
Max Columns in Index : 16
Max Columns in Order By : 0
Max Columns in Select : 4096
Max Columns in Table : 1024
Numeric Functions : 16777215
SQL Grammar Support : 1
Outer Joins : Y
String Functions : 5242879
System Functions : 7
Time/Date Functions : 2097151
File Usage : 0
Active Statements : 1
Password :
Persist Security Info :
User ID :
Data Source :
Window Handle :
Location :
Mode :
Prompt : 4
Connect Timeout : 15
Extended Properties : DRIVER=SQL Server;SERVER=(local);UID=sa;PWD=;APP=Visual
Basic;WSID=CHRIS;DATABASE=pubs
Locale Identifier : 1042
Initial Catalog :
OLE DB Services : -7
Autocommit Isolation Levels : 4096

 

Provider 속성

Provider 속성은 Connection 개체의 Provider의 이름을 지정하는 속성이다. 이 값은 ConnectionString 속성에서 지정할 수도 있으며, Open 메서드의 ConnectionString 매개변수에서 지정할 수도 있지만, Connection 개체의 Provider 속성을 이용해서 지정하는 것이 일일이 Open 메서드를 사용할 때 지정하는 것보다는 좀 더 명시적이라고 볼 수 있다. 이 값은 지정하지 않으면, 디폴트 값인 MSDASQL (Microsoft OLE DB Provider for ODBC)로 지정된다.

Provider 속성의 값은 데이터 소스에 연결이 이루어지기 전에는 Read/Write 가능하며, 연결이 이루어진 후에는 읽기 전용이다.

[예제]

다음 예제는 Provider를 지정하고 Connection 개체를 연결한 다음에 Provider 정보를 MsgBox로 보여주는 예이다.

Private Sub cmdProvider_Click()
   Dim adoCn As New ADODB.Connection

   adoCn.Provider = "sqloledb"

   adoCn.Open "Data Source=(local);Initial Catalog=Pubs;User ID=sa;PAssword="

   MsgBox "Provider : " & adoCn.Provider

   adoCn.Close

   Set adoCn = Nothing
End Sub

 

 

State 속성

State 속성은 Connection 개체가 데이터 소스에 연결된 상태인지, 연결이 되지 않은 상태인지를 나타내는 속성이다.

상수

설명

adStateClosed

Connection 개체가 데이터 소스에 연결된 상태를 나타낸다.

adStateOpen

Connection 개체가 데이터 소스에 연결되지 않은 상태를 나타낸다

State 프로퍼티는 Connection 개체를 사용하고자 하는 특정한 때에 Connection 개체의 상태를 알고자 할 때 사용할 수 있으며, 이 값은 읽기 전용이다.

이 프로퍼티는 Command 개체와 Recordset개체에도 있다.

[예제]

다음 예제는 Connection 개체를 닫을 때, Connection 개체가 데이터 소스에 연결되어 있는지를 확인한 후 Connection 개체의 연결을 닫는 코드를 보여준다.

Private Sub cmdState_Click()
   Dim adoCn As New ADODB.Connection

   adoCn.ConnectionString = "Data Source=Pubs;User ID=sa;Password=;"
   adoCn.Open

   If adoCn.State = adStateOpen Then
      adoCn.Close
   End If

   Set adoCn = Nothing
End Sub

 

 

Version 속성

Version 속성은 ADO의 버전 정보를 나타내는 속성이며, 읽기 전용이다.

[예제]

다음 예제는 ADO의 버전 정보 이외에 Connection 개체의 Properties 속성을 사용해서 DBMS 이름, DBMS 버전 등의 여러 정보도 함께 보여주고 있다.

Private Sub cmdVersion_Click()
   Dim adoCn As New ADODB.Connection
   Dim strConn As String

   strConn = "Driver={SQL Server};Server=(local);" & _
      "User id=sa;Password=;Database=pubs;""

   adoCn.Open strConn

   MsgBox "ADO Version: " & adoCn.Version & vbCr & _
      "DBMS Name: " & adoCn.Properties("DBMS Name") & vbCr & _
      "DBMS Version: " & adoCn.Properties("DBMS Version") & vbCr & _
      "OLE DB Version: " & adoCn.Properties("OLE DB Version") & vbCr & _
      "Provider Name: " & adoCn.Properties("Provider Name") & vbCr & _
      "Provider Version: " & adoCn.Properties("Provider Version") & vbCr & _
      "Driver Name: " & adoCn.Properties("Driver Name") & vbCr & _
      "Driver Version: " & adoCn.Properties("Driver Version") & vbCr & _
      "Driver ODBC Version: " & adoCn.Properties("Driver ODBC Version")

   adoCn.Close
   Set adoCn = Nothing
End Sub

실행결과는 다음과 같다


[
그림] ADO 버전 정보 화면

 

 

Connection 개체의 메서드

메서드

설명

BeginTrans

진행 중인 명령(Command)의 실행을 중단한다.

Cancel

진행 중인 명령(Command)의 실행을 중단한다.

Close

활성화된 Connection 개체를 닫는다.

CommitTrans

활성화된 Connection 개체에서 현재의 트랜잭션을 Commit한다.

Execute

명령을 실행한다. 만약 Recordset이 반환된다면, 디폴트 Recordset 개체로 반환된다.

Open

Connection 개체를 데이터 소스에 연결한다.

OpenSchema

Recordset 개체의 스키마 정보를 반환한다.

RollbackTrans

활성화된 Connection 개체에서 현재의 트랜잭션을 Rollback 한다.

BeginTrans, CommitTrans, RollbackTrans 메서드

이 세개의 메서드는 트랜잭션을 관리하는 메서드이다. BeginTrans 메서드는 새로운 트랜잭션을 시작하며, CommitTrans 메서드는 시작된 트랜잭션의 변경된 내용을 저장하고 트랜잭션을 종료시킨다. RollbackTrans 메서드는 시작된 트랜잭션 동안에 변경된 내용을 취소하고 트랜잭션을 종료시킨다.

이 세 메서드는 다음과 같은 구문을 사용한다.

  adoCn.BeginTrans
  adoCn.CommitTrans
  adocn.RollbackTrans

BeginTrans, CommitTrans, RollbackTrans 메서드는 CusorLocation이 클라이언트인 Connection 개체에서는 작동하지 않는다.

[예제 1]

다음 예제는 Pubs 데이터베이스의 Titles 테이블의 Type 필드의 값이 "psychology"인 필드의 값을 "self_help"로 변경한 후, 코드의 마지막에서 트랜잭션을 Rollback 하는 예이다.

Private Sub cmdBeginTrans_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adoCn.Open strConn

   adoRs.Open "Titles", adoCn, adOpenKeyset, adLockOptimistic, adCmdTable

   adoCn.BeginTrans

   ' Type
"psychology" 이면 "self_help"로 변경한다.
   Do Until adoRs.EOF
      If Trim(adoRs!Type) = "psychology" Then
         adoRs!Type = "self_help"
         adoRs.Update
      End If

      adoRs.MoveNext
   Loop

   '
데이터베이스로부터 다시 Recordset의 내용을 가져온다.
   adoRs.Requery

   adoRs.MoveFirst

   Do While Not adoRs.EOF
      Debug.Print adoRs!Title & " - " & adoRs!Type
      adoRs.MoveNext
   Loop

   '
모든 변경 작업을 취소한다.
   adoCn.RollbackTrans

   adoRs.Requery

   adoRs.MoveFirst

   Do While Not adoRs.EOF
      Debug.Print adoRs!Title & " - " & adoRs!Type
      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

[예제 2]

다음 예제는 Recordset 개체를 통한 트랜잭션이 아니라 Connection 개체의 Execute 메서드를 사용한 트랜잭션을 Rollback 하는 예이다.

Private Sub cmdRollbackTrans_Click()
   Dim adoCn As New ADODB.Connection
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adoCn.Open strConn

   adoCn.BeginTrans

   adoCn.Execute "Update Titles Set Type = 'self_help' Where Type = 'psychology'"

   '
모든 변경 작업을 취소한다.
   adoCn.RollbackTrans

   adoCn.Close
   Set adoCn = Nothing
End Sub

 

 

Cancel 메서드

Cancel 메서드는 비동기적으로 실행중인 명령을 중지시킨다. Cancel 메서드는 Connection 개체의 Execute, Open 메서드에 의해서 실행된 명령을 중지시킬 수 있으며, 이 메서드들은 adConnectAsync, adExecuteAsync 옵션으로 시작되었어야만 한다. 그렇지 않을 경우에는 Cancel 메서드에 의해서 명령을 중지하려고 하면 오류가 발생한다.

Cancel 메서드는 Command 개체와 Recordset 개체에도 있다.

[예제]

다음 예제는 비동기적으로 SQL 문장을 실행 한 다음에 For…Next 문장을 사용해서 시간을 지연시킨다. 그런 다음에 여전히 SQL 문장이 실행 중이면 Cancel 메서드를 사용해서 작업을 중지하고 트랜잭션을 Rollback 시키고, 실행이 완료되었으면 트랜잭션을 Commit 하는 예이다.

Private Sub cmdCancel_Click()
   Dim adoCn As New ADODB.Connection
   Dim strConn As String
   Dim Sql As String
   Dim i As Integer

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adoCn.Open strConn

   Sql = "UPDATE Titles SET Type = 'self_help' WHERE type = 'psychology'"

   adoCn.BeginTrans

   adoCn.Execute Sql, , adAsyncExecute

   '
비동기적으로 처리하기 때문에 Update문장이 수행되는 동안
   '
다른 작업이 진행됨을 보여준다.
   For i = 1 To 10
      Debug.Print i
   Next i

   ' For...Next
문이 수행되는 동안 Update 작업이 완료되지 않았다면
   '
작업을 Cancel 시키고 Rollback 한다.
   '
작업이 완료되었다면 Commit한다.
   If adoCn.State = adStateExecuting Then
      adoCn.Cancel
      adoCn.RollbackTrans

      MsgBox "Update canceled."
   Else
      adoCn.CommitTrans

      MsgBox "Update complete."
   End If

   adoCn.Close
   Set adoCn = Nothing
End Sub

 

 

Close 메서드

Close 메서드는 열려진 Connection 개체와 그 하위 개체를 닫는 메서드이다. Connection 개체 또는 Recordset 개체에서 이 메서드를 사용하게 되면 해당 개체가 사용하던 시스템의 자원들이 반환되며, 개체가 사용한 메모리를 완전히 반환하기 위해서는 Set문을 사용해서 개체 변수를 Nothing으로 설정한다.

Connection 개체의 CommandTimeout 속성의 설정 값은 Command 개체의 CommandTimeout 속성 값에 영향을 미치지 못한다. 그 이유는 Connection 개체의 CommandTimeout 속성은 Command 개체의 CommandTimeout 속성에 상속되지 않기 때문이다.

Connection 개체를 Close 메서드를 사용해서 닫을 경우에 만약 하위 Recordset 개체가 사용중이었다면, Recordset에 의해서 진행 중이던 트랜잭션은 Provider에 의해서 자동으로 Rollback 된다.

[예제]

다음 예제는 Pubs 데이터베이스에 접속하고 연결을 끊는 예이다.

Private Sub cmdClose_Click()
   Dim adoCn As New ADODB.Connection

   adoCn.Open "DSN=Pubs"

   adoCn.Close

   Set adoCn = Nothing
End Sub

클라이언트에서 Connection 개체의 Close 메서드를 수행하면 서버 측에서는 Connection 개체와 데이터베이스를 연결하기 위해서 사용했던 시스템 리소스를 반환한다.

 

 

Execute 메서드

Execute 메서드는 다음과 같은 구문을 사용한다.

Recordst 개체가 반환될 경우

Set Recordset = Connection.Execute (CommandText As String, _
[RecordsAffected As Long], [Options As Enum])

Recordset
개체가 반환되지 않을 경우

Connection.Execute CommandText As String, [RecordsAffected As Long], [Options As Enum]

Execute 메서드는 다음과 같은 매개변수를 갖는다.

매개변수

데이터 형식

설명

CommandText

String

수행할 명령을 기술하는 매개변수이며, SQL 문장, 테이블 명, 저장 프로시저를 지정할 수 있다.

RecordsAffected

Long

Execute 메서드에 의해서 영향을 받은 레코드의 개수를 반환한다. 예를 들면 Delete문장을 수행했는데, 10 개의 레코드가 삭제되었다면, 10 이라는 값을 반환한다.

Options

Long

Provider CommandText를 어떻게 수행할지를 결정하는 방법을 지정하는 값이며, 데이터 형식은 Long이다.

Options 매개변수는 다음 중 하나의 값을 가질 수 있다.

상수

설명

adCmdText

CommandText의 값을 SQL 문장으로 처리한다.

adCmdTable

CommandText의 값을 테이블 명으로 하는 SQL 문장을 만들어서 처리한다.

adCmdTableDirect

CommandText의 값을 테이블 명으로 처리한다.

adCmdStoredProc

CommandText의 값을 저장 프로시저로 처리한다.

adCmdUnknown

명령의 형식을 알 수 없음으로 처리한다.

adAsyncExecute

명령을 비동기적으로 수행한다.

adAsyncFetch

CacheSize 속성에 지정된 수 만큼의 레코드씩 비동기적으로 처리한다.

ReturnValue(Recordset)는 수행된 명령이 결과값을 반환할 경우 디폴트 Recordset으로 생성해서 반환한다.

Execute 메서드의 수행이 완료되면 ExecuteComplete 이벤트가 발생한다.

Execute 메서드의 수행 결과가 Recordset을 반환 할 경우, 디폴트 형태로 생성된 Recordset은 읽기 전용이고, forward-only 커서이다. 그래서 Recordset 개체로 데이터를 수정할 목적이라면 Recordset 개체의 Open 메서드를 사용해서 수정 가능한 Recordset 개체를 열어야 한다.

[예제]

다음 예제는 Execute 메서드를 통해서 변경된 레코드의 개수를 보여주며, Execute 메서드를 수행하기 전과 후의 데이터를 비교해서 직접 실행창에 보여주는 예이다.

Private Sub cmdExecute_Click()
   Dim adoCn As New ADODB.Connection
   Dim strConn As String
   Dim Sql As String
   Dim iAffected As Integer
   Dim adoRs As New ADODB.Recordset

   Sql = "UPDATE Titles SET Type = " & _
         "'self_help' WHERE Type = 'psychology'"

   'Connection
연결
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adoCn.Open strConn

   adoRs.Open "Titles", adoCn, adOpenStatic, adLockOptimistic

   'Update
문장을 수행하기 전의 데이터
   While Not adoRs.EOF
      Debug.Print adoRs!Title & ", " & adoRs!Type & vbCrLf

      adoRs.MoveNext
   Wend

   adoCn.Execute Sql, iAffected

   'Update
문장에 영향을 받은 레코드 수
   Debug.Print iAffected & "
개의 레코드가 변경되었음."

   adoRs.Requery

   'Update
문장을 수행한 후의 데이터
   Do While Not adoRs.EOF
      Debug.Print adoRs!Title & ", " & adoRs!Type & vbCrLf

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

 

 

Open 메서드

Open 메서드는 다음과 같은 구문을 사용한다.

Open [ConnectionString As String], [UserID As String], [Password As String], [Options As Enum]

ConnectionString은 데이터베이스 연결에 사용할 정보를 지정하는 Connection 개체의 속성이며, User ID는 데이터베이스의 사용자 계정이며, Password는 사용자 계정의 암호이다. 옵션은 Connection 개체를 동기적 또는 비동기적으로 연결할 때 사용하는 매개변수로서 옵션을 adAsyncConnect로 지정하면 비동기적으로 Connection 개체를 연결하며, Connection 개체가 성공적으로 데이터 소스에 연결 되면 ConnectComplete 이벤트가 발생한다. 디폴트 값을 동기적으로 데이터 소스에 연결하는 것이다.

Open 메서드를 사용하기 전에 Connection 개체의 ConnectionString 속성을 이미 설정했다면, ConnectionString 매개변수는 지정하지 않아도 된다. 이유는 Connection 개체의 ConnectionString 속성이 Open 메서드의 ConnectionString 매개변수로 상속되기 때문이다.

[예제1]

다음 예제는 Pubs 데이터베이스에 Connection 개체를 연결하는 예이다.

Private Sub cmdOpen_Click()
   Dim adoCn As New ADODB.Connection
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   adoCn.Open strConn

   Debug.Print "Opened"

   adoCn.Close
   Set adoCn = Nothing

   Debug.Print "Closed"
End Sub

[예제 2]

다음 예제는 Pubs 데이터베이스에 Connection 개체를 비동기적으로 연결하는 예이다.

Private Sub cmdOpenAsync_Click()
   Dim adoCn As New ADODB.Connection
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   adoCn.Open strConn, , , adAsyncConnect

   Debug.Print "Opened - Async"

   adoCn.Close
   Set adoCn = Nothing

   Debug.Print "Closed"
End Sub

 

 

OpenSchema 메서드

OpenSchema 메서드는 Provider를 통해서 데이터베이스의 스키마 정보를 얻는 메서드이며, 다음과 같은 구문을 사용한다.

Set Recordset = Connection.OpenSchema (QueryType, Criteria, SchemaID)

반환되는 Recordset은 데이터베이스에 대한 스키마 정보를 갖고 있으며, 읽기 전용의 Static 커서로 되어 있다.

QueryType은 질의의 타입을 지정하는 매개변수이며, Criteria QueryType에 따라서 지정하는 질의의 조건이며 선택사항이다.

QueryType

Criteria

adSchemaAsserts

CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
CONSTRAINT_NAME

adSchemaCatalogs

CATALOG_NAME

adSchemaCharacterSets

CHARACTER_SET_CATALOG
CHARACTER_SET_SCHEMA
CHARACTER_SET_NAME

adSchemaCheckConstraints

CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
CONSTRAINT_NAME

adSchemaCollations

COLLATION_CATALOG
COLLATION_SCHEMA
COLLATION_NAME

adSchemaColumnDomainUsage

DOMAIN_CATALOG
DOMAIN_SCHEMA
DOMAIN_NAME
COLUMN_NAME

adSchemaColumnPrivileges

TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME
GRANTOR
GRANTEE

adSchemaColumns

TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAM

adSchemaConstraintColumnUsage

TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME/td>

adSchemaConstraintTableUsage

TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME

adSchemaForeignKeys

PK_TABLE_CATALOG
PK_TABLE_SCHEMA
PK_TABLE_NAME
FK_TABLE_CATALOG
FK_TABLE_SCHEMA
FK_TABLE_NAME

adSchemaIndexes

TABLE_CATALOG
TABLE_SCHEMA
INDEX_NAME
TYPE
TABLE_NAME

adSchemaKeyColumnUsage

CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
CONSTRAINT_NAME
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
COLUMN_NAME

adSchemaPrimaryKeys

PK_TABLE_CATALOG
PK_TABLE_SCHEMA
PK_TABLE_NAME

adSchemaProcedureColumns

PROCEDURE_CATALOG
PROCEDURE_SCHEMA
PROCEDURE_NAME
COLUMN_NAME

adSchemaProcedureParameters

PROCEDURE_CATALOG
PROCEDURE_SCHEMA
PROCEDURE_NAME
PARAMTER_NAME

adSchemaProcedures

PROCEDURE_CATALOG
PROCEDURE_SCHEMA
PROCEDURE_NAME
PARAMTER_TYPE

adSchemaProviderSpecific

아래 설명 참조

adSchemaProviderTypes

DATA_TYPE
BEST_MATCH

adSchemaReferentialConstraints

CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
CONSTRAINT_NAME

adSchemaSchemata

CATALOG_NAME
SCHEMA_NAME
SCHEMA_OWNER

adSchemaSQLLanguages

<없음>

adSchemaStatistics

TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME

adSchemaTableConstraints

CONSTRAINT_CATALOG
CONSTRAINT_SCHEMA
CONSTRAINT_NAME
TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
CONSTRAINT_TYPE

adSchemaTablePrivileges

TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
GRANTOR
GRANTEE

adSchemaTables

TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME
TABLE_TYPE

adSchemaTranslations

TRANSLATION_CATALOG
TRANSLATION_SCHEMA
TRANSLATION_NAME

adSchemaUsagePrivileges

OBJECT_CATALOG
OBJECT_SCHEMA
OBJECT_NAME
OBJECT_TYPE
GRANTOR
GRANTEE

adSchemaViewColumnUsage

VIEW_CATALOG
VIEW_SCHEMA
VIEW_NAME

adSchemaViewTableUsage

VIEW_CATALOG
VIEW_SCHEMA
VIEW_NAME

adSchemaViews

TABLE_CATALOG
TABLE_SCHEMA
TABLE_NAME

SchemaID OLE DB의 사양에 의해서 정의되지 않은 Provider 스키마 질의를 위한 GUID이다. 만약 QueryType adSchemaProviderSpecific으로 설정했을 경우에만 반드시 필요하다.

OpenSchema 메서드는 서버에 있는 데이터베이스의 정보 또는 테이블의 필드의 정보와 같은 데이터 소스의 정보를 반환하는 메서드이다.

Criteria 인수는 스키마 질의의 결과로 사용되어질 수 있는 값들의 배열이다. 각 스키마 질의는 각각의 서로 다른 매개변수를 가지며, 실제 스키마는 IDBSchemaRowset 인터페이스 하에서 OLE DB의 사양에 의해서 정의된다.

QueryType 인수로 adSchemaProviderSpecific가 사용되면 Provider는 비 표준 스키마 질의를 생성하며, SchemaID 인수는 실행하기 위해서 스키마 질의의 GUID를 요구하게 된다. 만약 SchemaID를 지정하지 않으면 실행 오류가 발생하게 된다.

Provider OEL DB 표준 스키마 질의의 모두를 지원하기를 요구하지 않는다. 특별히 adSchemaTables, adSchemaColumns, adSchemaProviderTypes 이 세가지만, OLE DB의 사용을 요구하고 있다.

OpenSchema 메서드는 클라이언트 측의 Connection 개체에서는 사용할 수 없다.

[예제 1]

다음 예제는 SQL 서버의 Pubs 데이터베이스의 테이블에 대한 정보를 조회하는 예이다.

Private Sub cmdOpenSchema_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adoCn.Open strConn

   Set adoRs = adoCn.OpenSchema(adSchemaTables)

   Do Until adoRs.EOF
      Debug.Print "
테이블명: " & adoRs!Table_Name & vbCrLf & _
            "
테이블 타입: " & adoRs!Table_Type & vbCr
      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

[예제 2]

다음 예제는 Criteria 매개변수를 이용해서 Pubs 데이터베이스의 뷰(View)에 대한 정보를 조회하는 예이다.

Private Sub cmdOpenSchema2_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adoCn.Open strConn

   Set adoRs = adoCn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "VIEW"))

   Do Until adoRs.EOF
      Debug.Print "
테이블 명: " & adoRs!Table_Name & vbCrLf & _
            "
테이블 타입:" & adoRs!Table_Type & vbCr

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

 

 

Connection 개체의 이벤트

ADO Connection 개체와 Recordset 개체에서 이벤트를 제공하고 있으며, Command 개체는 이벤트를 제공하지 않는다.

Connection 개체의 이벤트는 다음과 같다.

이벤트

설명

BeginTransComplete

새로운 트랜잭션이 성공적으로 시작한 후 발생하는 이벤트

CommitTransComplete

트랜잭션이 성공적으로 저장된 후 발생하는 이벤트

ConnectComplete

연결이 성공적으로 이루어진 후 발생되는 이벤트

Disconnect

연결이 끊겨진 후 발생되는 이벤트

ExecuteComplete

실행이 완료된 후 발생되는 이벤트

InfoMessage

adoErrors 컬렉션에 정보 메시지가 추가될 때 발생하는 이벤트

RollbackTransComplete

Rollback이 성공적으로 이루어진 후 발생되는 이벤트

WillConnect

연결이 이루어지기 이전에 발생하는 이벤트

WillExecute

질의가 수행되기 이전에 발생하는 이벤트

ADO Connection 개체의 이벤트를 사용하기 위해서 비주얼 베이직에서 ADODB.Connection 개체를 선언할 때 WithEvents 문으로 다음과 같이 기술해야 한다.

  Dim WithEvents adoCn As ADODB.Connection

위와 같이 코딩을 하면 비주얼 베이직의 코드 편집창에 다음 그림과 같이 이벤트에 대한 목록이 나타난다.


[
그림]Connection 개체의 이벤트

Connection 개체의 이벤트를 사용하기 위해서는 WithEvents 문과 함께 adoCn 변수를 선언하게 되는데, 이 경우에는 변수를 선언할 때 New 키워드를 함께 사용할 수 없으며, Connection 개체를 사용하기 전에 Connection 개체의 새로운 인스턴스를 다음과 같은 코드로 생성해야 한다.

  Set adoCn = New ADODB.Connection

참고  Early Binding Late Binding

비주얼 베이직에서 특정 개체를 사용하려면 Object 변수에 개체를 바인딩해야하며, 바인딩 형식에 따라 Early Binding Late Binding으로 분류할 수 있다.

Early Bind
은 비주얼 베이직의 프로젝트 메뉴의 참조에서 사용할 개체를 참조한 상태에서 개체를 사용하는 경우에 사용되는 바인딩 방식이며, 사용 예는 다음과 같다.

  Dim adoCn As New ADODB.Connection

Early Binding
은 디자인 모드에 바인딩이 이루어지며, 컴파일러는 실행 모드에서 개체를 접근하는 코드를 보다 더 효율적으로 생성하기 때문에 응용 프로그램의 실행 속도는 더 빨라진다.

Early Binding
을 사용할 경우에도 위의 예제 코드 보다는 다음과 같은 코드 방식이 권장된다.

  Dim adoCn as ADODB.Connection
  Set adoCn = New ADODB.Connection

선언문에 New 키워드를 함께 사용하면 개체가 처음 사용될 때까지 클래스의 인스턴스 생성을 지연하게 되며, 응용 프로그램이 개체를 사용할 때마다 생성되었는지를 확인해야 하는 추가적인 작업이 필요하게 된다. 그로 인해서 응용 프로그램의 성능은 치명적으로 저하될 수 있다. 그렇기 때문에 외부 구성요소에 대한 개체를 생성하기 위해서 선언문에 New 키워드는 절대로 사용하지 않기를 권장한다.

반면에 Late Binding은 비주얼 베이직의 프로젝트 메뉴의 참조에서 사용할 개체를 참조하지 않은 상태에서 개체를 사용하는 경우에 사용되는 바인딩 방식이며, 디자인 모드에서 개체에 대해 알려진 정보는 없이 실행되는 경우이다. 그렇기 때문에 사용될 변수는 Object 변수로 선언하며, 실행 모드에 개체에 접근하기 위해서 비주얼 베이직은 추가적인 작업을 해야한다. 이로 인해 응용 프로그램의 성능에 부정적인 영향을 미친다.

  Dim adoCn As Object
  Set adoCn = CreateObject("ADODB.Connection")

일반적으로 MTS에 등록된 구성요소를 클라이언트에서 호출할 경우에는 Late Binding으로 처리하는 경우가 많다. 그 이유는 빈번히 수정되고 추가되는 구성요소에 대한 정보를 일일이 비주얼 베이직의 프로젝트 메뉴의 참조(References)에서 지정하는 것도 번거로우며, 또한 MTS에서 제공하는 ORB(Object Request Broker) 개념에도 적합하기 때문이다.

BeginTransComplete 이벤트

BeginTransComplete 이벤트는 새로운 트랜잭션이 성공적으로 시작한 후 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.

BeginTransComplete (TransactionLevel, pError, adStatus, pConnection)

인수

데이터 형식

설명

TransactionLevel

Long

이벤트를 발생시킨 BeginTrans의 새로운 트랜잭션 레벨을 나타낸다.

pError

ADODB.Error

오류가 발생해서 adStatus adStatusErrorsOccurred 이면 발생한 오류에 대한 정보를 가지고 있는 개체이다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

ADODB.EventStatusEnum

EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.

pConnection

ADODB.Connection

BeginTrans를 수행한 Connection 개체를 나타낸다.

트랜잭션이 시작될 때, 종속적으로 수행해야 할 다른 작업이 있다면 이 이벤트를 사용해서 구현할 수 있다. 예를 들어, 트랜잭션 모니터링 도구를 만들려면 이 이벤트를 사용해서 트랜잭션 로그를 생성할 수 있을 것이다.

 

 

CommitTransComplete 이벤트

CommitTransComplete 이벤트는 트랜잭션이 성공적으로 저장된 후 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.

CommitTransComplete (pError, adStatus, pConnection)

인수

데이터 형식

설명

pError

ADODB.Error

오류가 발생해서 adStatus adStatusErrorsOccurred 이면 발생한 오류에 대한 정보를 가지고 있는 개체이다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

ADODB.EventStatusEnum

EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.

pConnection

ADODB.Connection

CommitTrans를 수행한 Connection 개체를 나타낸다.

트랜잭션이 성공적으로 완료되었을 때, 종속적으로 수행해야 할 다른 작업이 있다면 이 이벤트를 사용해서 구현할 수 있다.

 

 

ConnectComplete 이벤트

ConnectComplete 이벤트는 Connection 개체가 데이터 소스에 성공적으로 연결한 직후에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.

ConnectComplete (pError, adStatus, pConnection)

인수

데이터 형식

설명

pError

ADODB.Error

오류가 발생해서 adStatus adStatusErrorsOccurred 이면 발생한 오류에 대한 정보를 가지고 있는 개체이다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

ADODB.EventStatusEnum

EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.

pConnection

ADODB.Connection

이벤트를 발생시킨 Connection 개체를 나타낸다.

데이터 소스에 연결이 성공적으로 이루어졌는지를 자세히 점검하기 위해서 이 이벤트를 사용할 수 있다.

[예제]

다음 예제는 두 개의 CommandButton(cmdOpen cmdClose)을 사용해서 데이터 소스에 연결하고 연결을 끊는 코드를 작성한다. 그리고 ConnectComplete 이벤트에서 연결이 성공적으로 이루어졌는지를 점검하고 오류가 발생했다면 오류 메시지를 디버그 창에 나타내고, 성공했다면 성공 메시지를 나타내는 예이다.

Private Sub cmdOpen_Click()
   Dim strConn As String

   Set adoCn = New ADODB.Connection

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   adoCn.Open strConn
End Sub

Private Sub cmdClose_Click()
   adoCn.Close

   Set adoCn = Nothing
End Sub

Private Sub adoCn_ConnectComplete(ByVal pError As ADODB.Error, _
   adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)

   Select Case adStatus
      Case adStatusErrorsOccurred
         Debug.Print "
연결 실패" & vbCrLf & _
            "ConnectionString : " & pConnection.ConnectionString & vbCrLf & _
               "
오류 메시지 : " & pError.Description
      Case adStatusOK
         Debug.Print "
연결 성공"
   End Select
End Sub

 

 

Disconnect 이벤트

Disconnect 이벤트는 Connection 개체의 데이터 소스와의 연결이 끊어진 직후에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.

Disconnect (adStatus, pConnection)

인수

데이터 형식

설명

adStatus

ADODB.EventStatusEnum

EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.

pConnection

ADODB.Connection

이벤트를 발생시킨 Connection 개체를 나타낸다.

이 이벤트는 데이터 소스와의 연결이 정상적으로 끊어졌는지를 점검하기 위해서 사용할 수 있다. 예를 들어, 네트워크의 장애로 인해서 Connection 개체의 데이터 소스와의 연결이 비 정상적으로 끊어진 경우에, 이 이벤트를 사용해서 응용 프로그램 사용자에게 오류 메시지를 표시하도록 구현할 수 있다.

ExecuteComplete 이벤트

ExecuteComplete 이벤트는 실행이 완료된 직후에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.

ExecuteComplete (RecordsAffected, pError, adStatus, pCommand, pRecordset, pConnection)

인수

데이터 형식

설명

RecordsAffected

Long

실행된 명령에 영향을 받은 레코드의 개수를 나타낸다.

pError

ADODB.Error

오류가 발생해서 adStatus adStatusErrorsOccurred 이면 발생한 오류에 대한 정보를 가지고 있는 개체이다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

ADODB.EventStatusEnum

EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.

pCommand

ADODB.Command

이 이벤트에 적용된 Command 개체를 나타낸다. Command 개체가 사용되지 않았다면 설정되지 않는다.

pRecordset

ADODB.Recordset

Execute 메서드에 의해서 생성된 Recordset 개체를 나타낸다. Action Query와 같이 반환 값이 없는 명령이 실행된 경우에는 Empty 값을 나타낸다.

pConnection

ADODB.Connection

Execute 메서드를 실행한 Connection 개체를 나타낸다.

이 이벤트는 명령이 성공적으로 수행되었는지를 점검하거나, 몇 개의 레코드가 명령에 의해서 영향을 받았는지를 알기 위해서 사용할 수 있다. 몇 개의 레코드가 영향을 받았는지를 알기 위해서 다음과 같이 코드를 작성할 수 있다.

Private Sub adoCn_ExecuteComplete(ByVal RecordsAffected As Long, _
     ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, _
     ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, _
     ByVal pConnection As ADODB.Connection)

   If adStatus = adStatusOK Then
      Debug.Print RecordsAffected & "
개의 레코드가 변경되었습니다"
   End If
End Sub

참고

ExecuteComplete 이벤트는 Connection.Execute, Command.Execute, Recordset.Open 또는 Recordset.NextRecordset을 사용할 때 발생할 수 있다.

 

 

InfoMessage 이벤트

InfoMessage 이벤트는 adoErrors 컬렉션에 정보 메시지가 추가될 때 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.

InfoMessage (pError, adStatus, pConnection)

인수

데이터 형식

설명

pError

ADODB.Error

오류가 발생해서 adStatus adStatusErrorsOccurred 이면 발생한 오류에 대한 정보를 가지고 있는 개체이다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

ADODB.EventStatusEnum

EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.

pConnection

ADODB.Connection

메시지를 발생시킨 Connection 개체를 나타낸다.

이 이벤트는 ConnectionEvent 작업이 성공적으로 수행되고 Provider가 추가 정보를 반환할 때마다 발생한다.
이 이벤트를 사용해서 SQL Server ODBC 데이터 소스를 사용해서 접속할 때 발생하는 메시지를 로그에 저장하도록 구현할 수 있다.

데이터베이스에 접속하는 코드를 다음과 같이 작성한다.

Private Sub cmdOpenODBC_Click()
   Dim strConn As String

   Set adoCn = New ADODB.Connection

   strConn = "Driver={SQL Server};" & _
         "Server=(local);Database=Pubs;UID=sa;PWD="

   adoCn.Open strConn
End Sub

위의 코드가 수행되면 InfoMessage 이벤트가 발생하게 된다. 이 이벤트 프로시저에 다음 코드를 기술한다.

Private Sub adoCn_InfoMessage(ByVal pError As ADODB.Error, _
      adStatus As ADODB.EventStatusEnum, _
         ByVal pConnection As ADODB.Connection)

   For Each pError In pConnection.Errors
      Debug.Print pError.Description
   Next
End Sub

위의 예제의 결과는 다음과 같다.

  [Microsoft][ODBC SQL Server Driver][SQL Server]Changed database context to 'Pubs'.

  [Microsoft][ODBC SQL Server Driver][SQL Server]Changed language setting to us_english.

 

 

RollbackTransComplete 이벤트

RollbackTransComplete 이벤트는 Rollback이 성공적으로 이루어진 후에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.

RollbackTransComplete (pError, adStatus, pConnection)

인수

데이터 형식

설명

pError

ADODB.Error

오류가 발생해서 adStatus adStatusErrorsOccurred 이면 발생한 오류에 대한 정보를 가지고 있는 개체이다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

ADODB.EventStatusEnum

EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.

pConnection

ADODB.Connection

RollbackTrans를 수행한 Connection 개체를 나타낸다.

트랜잭션이 실패했을 때, 종속적으로 수행해야 할 다른 작업이 있다면 이 이벤트를 사용해서 구현할 수 있다.

예를 들어, 대량의 배치 작업을 수행할 경우에 이 이벤트를 사용해서 작업의 성공 여부를 확인할 수 있다

 

WillConnect 이벤트

WillConnect 이벤트는 연결이 이루어지기 이전에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.

WillConnect (ConnectionString, UserID, Password, Options, adStatus, pConnection)

인수

데이터 형식

설명

ConnectionString

String

데이터 소스에 대한 연결 정보를 나타낸다.

UserID

String

연결에 사용할 사용자 ID를 나타낸다.

Password

String

연결에 사용할 암호를 나타낸다.

Options

Long

Connection 개체의 Open 메서드에 사용된 부가적인 연결 옵션을 나타낸다.

adStatus

ADODB.EventStatusEnum

EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.

pConnection

ADODB.Connection

RollbackTrans를 수행한 Connection 개체를 나타낸다.

이 이벤트를 사용해서 메서드의 결과가 반환되기 전에 매개변수의 정보들을 변경할 수 있다. 예를 들어, 사용자 ID를 지정하지 않은 사용자에 대해서 "Guest"로 접속하도록 하려면 다음과 같이 이벤트 프로시저에 코딩하면 된다.

Private Sub adoCn_WillConnect(ConnectionString As String, _
      UserID As String, Password As String, Options As Long, _
      adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)

   If adStatus = adStatusOK And UserID = "" Then
      UserID = "Guest"
   End If
End Sub

 

 

WillExecute 이벤트

WillExecute 이벤트는 질의가 수행되기 이전에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.

WillExecute (Source, CursorType, LockType, Options, adStatus, pCommand, pRecordset, pConnection)

인수

데이터 형식

설명

Source

String

SQL 문장 또는 저장 프로시저의 이름을 포함하는 문자열이다.

CursorType

ADODB.CursorTypeEnum

생성될 Recordset 개체의 Cursor Type을 나타낸다. WillExecute 이벤트가 발생할 때, 이 매개 변수가 adOpenUnspecified로 설정되어 있으면 매개 변수를 변경할 수 없다.

LockType

ADODB.LockTypeEnum

생성될 Recordset 개체의 Lock Type을 나타낸다. WillExecute 이벤트가 발생할 때, 이 매개 변수가 adLockUnspecified로 설정되어 있으면 매개 변수를 변경할 수 없다.

Options

Long

명령을 실행할 때 또는 Recordset 개체를 생성할 때 사용된 옵션이며, Options 매개변수에 전달된 옵션 값을 나타낸다.

adStatus

ADODB.EventStatusEnum

EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.

pCommand

ADODB.Command

이 이벤트에 적용된 Command 개체를 나타낸다. Command 개체가 사용되지 않았다면 설정되지 않는다.

pRecordset

ADODB.Recordset

Execute 메서드에 의해서 생성된 Recordset 개체를 나타낸다. Action Query와 같이 반환 값이 없는 명령이 실행된 경우에는 Empty 값을 나타낸다.

pConnection

ADODB.Connection

이벤트를 발생시킨 Connection 개체를 나타낸다.

이 이벤트의 프로시저 내에서 매개변수들은 명령이 실행되기 전에 변경될 수 있다. 이 이벤트는 사용자가 ConnectionString을 작성해서 작업할 수 있도록 지원하는 응용 프로그램에서 사용자의 접근을 통제하기 위해서 사용할 수 있다.

다음 코드는 사용자가 특정 테이블에 질의를 수행하는 것을 방지하는 예이다.

Private Sub adoCn_WillExecute(Source As String, _
      CursorType As ADODB.CursorTypeEnum, _
      LockType As ADODB.LockTypeEnum, Options As Long, _
      adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, _
      ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)

   If Source = "Authors" Then
      MsgBox "
당신은 이 테이블에 접근할 수 없습니다."

      adStatus = adStatusCancel
   End If
End Sub

위의 예는 사용자가 Authors 테이블에 접근하는 것을 방지하는 예이다. 또한 ad-hoc 삽입이나 삭제와 같은 작업을 방지하기 위해서 이 이벤트를 응용할 수 있다.

 

Parameters 컬렉션

Parameters 컬렉션은 Command 개체의 Parameter 개체들을 포함하고 있는 컬렉션이다.

Parameters 컬렉션은 저장 프로시저 또는 질의에 대한 매개변수를 전달할 때 주로 사용하는 개체이며, Parameter 개체는 Append 메서드를 사용해서 Parameters 컬렉션에 추가된다.

매개변수를 갖는 저장 프로시저 또는 질의를 수행할 때, 매개변수를 전달하는 방법에는 Command 개체의 Parameters 컬렉션을 사용하는 방법과 Execute 메서드의 두 번째 인수로 배열 값을 지정해서 매개변수로 넘겨주는 방법이 있다.

Command 개체를 사용하면 여러 가지 편리한 점이 있지만, 반면에 저장 프로시저로부터 다양한 Recordset 개체를 반환받지 못한다는 점이 제한 사항이다. Command 개체를 사용해서 반환되는 Recordset 개체는 디폴트 Recordset 개체로서 CursorLocation 속성은 adUseServer(2) 이며, CursorType 속성은 adOpenForwardOnly(0) 이며, LockType 속성은 adLockReadOnly(1) 이다.

Parameters 컬렉션은 한 개의 속성과 네 개의 메서드를 가지고 있다.

Parameters 컬렉션의 속성

속성

설명

기본 값

데이터 형식

Count

Parameters 컬렉션에 포함된 Parameter 개체의 개수를 반환한다 (읽기 전용)

0

Long

Item

이름이나 인덱스를 사용해서 Parameters 컬렉션에서 특정 Parameter 구성원을 반환한다.

없음

Parameter

Count 속성

Count 속성은 Parameters 컬렉션에 포함된 Parameter 개체의 개수를 반환한다. 이 속성의 데이터 형식은 Long이며, 읽기 전용이다.

루프를 사용해서 Parameters 컬렉션의 모든 Parameter 개체를 반복해서 처리하려면 For Each…Next 문을 사용한다.

Count 속성이 0이면 컬렉션 내에 Parameter 개체가 존재하지 않는다.

[예제]

다음 예제는 SQL 서버의 Pubs 데이터 베이스에 있는 byroyalty라는 저장 프로시저를 실행하는 예이며, Parameters 개체의 Count 속성을 사용해서 매개변수의 개수를 MsgBox로 나타낸다.

Private Sub cmdCount_Click()
   Dim adocn As New ADODB.Connection
   Dim adoCmd As New ADODB.Command
   Dim adoPara As New ADODB.Parameter
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adocn.Open strConn

   Set adoCmd.ActiveConnection = adocn

   adoCmd.CommandText = "byroyalty"
   adoCmd.CommandType = adCmdStoredProc
   adoCmd.CommandTimeout = 15

   adoPara.Type = adInteger
   adoPara.Size = 3
   adoPara.Direction = adParamInput
   adoPara.Value = 100
   adoCmd.Parameters.Append adoPara

   MsgBox "Count
속성 값 : " & adoCmd.Parameters.Count

   '
명령을 실행해서 Recordset 개체 생성
   Set adoRs = adoCmd.Execute()

   adoRs.Close
   Set adoRs = Nothing

   Set adoCmd = Nothing

   adocn.Close
   Set adocn = Nothing
End Sub

Item 속성

Item 속성은 이름이나 인덱스를 사용해서 Parameters 컬렉션에서 특정 Parameter 구성원을 반환하는 속성이며, Item 속성의 구문은 다음과 같다.

Set adoPara = adoCmd.Parameters.Item(Index)

위의 구문에서 매개변수 Index는 컬렉션에 들어 있는 개체의 이름이나 개체의 위치 순서를 나타내는 서수로 평가되는 Variant 값이다.

Item 속성은 Parameters 컬렉션의 기본 속성이며, 생략할 수 있다. 그래서 다음과 같은 구문을 모두 사용할 수 있다.

   adoCmd.Parameters.Item(Index)
   adoCmd(Index)
   adoCmd.Parameters("Name")

Parameters 컬렉션의 메서드

속성

설명

Append

Parameters 컬렉션에 Parameter 개체를 추가한다.

Delete

Parameters 컬렉션에서 Parameter 개체를 제거한다.

Refresh

Parameters 컬렉션에 있는 Parameter 개체들의 목록을 갱신한다.

Append 메서드

Append 메서드는 Parameter 컬렉션에 Parameter 개체를 추가하는 메서드이며, 다음과 같이 사용된다.

   Dim adoCmd As New ADODB.Command
   Dim adoPara As New ADODB.Parameter

   adoCmd.CommandText = "byroyalty"
   adoCmd.CommandType = adCmdStoredProc
   adoCmd.CommandTimeout = 15

   adoPara.Type = adInteger
   adoPara.Size = 3
   adoPara.Direction = adParamInput
   adoPara.Value = 100
   adoCmd.Parameters.Append adoPara

저장 프로시저의 매개변수 목록을 얻기 위해서 Refresh 메서드를 사용할 수 있다. 하지만, Refresh 메서드를 사용하면 네트워크를 통해서 데이터베이스에 한번 더 갔다 오기 때문에 응용 프로그램의 속도를 저하시키는 요인이 될 수 있다. 그렇기 때문에 매개변수를 Append 하는 것이 Refresh 메서드 보다 더 효율적이다.

Parameters 컬렉션에 Parameter 개체를 추가하려면 먼저 이 개체의 Type 속성을 설정해야 하며, 가변 길이 데이터 형식을 선택한 경우에는 Size 속성을 0보다 큰 값으로 설정해야 한다.

Delete 메서드

Delete 메서드는 Parameter 컬렉션에서 Parameter 개체를 제거하는 메서드이며, Parameter 개체의 이름 또는 인덱스를 사용해서 제거할 수 있다.

Delete 메서드는 다음과 같이 사용한다.

adoCmd.Parameters.Delete 0

위의 코드는 Command 개체의 첫번째 Parameter 개체를 제거하는 예이다.

Refresh 메서드

Refresh 메서드는 Parameters 컬렉션에 있는 Parameter 개체들의 목록을 갱신하는 메서드이다. 이 메서드는 Parameter의 정보를 갱신하기 위해서 데이터 소스까지 네트워크를 통해서 갔다 오는 성능 저하를 감수할 경우에 사용된다.

Refresh 메서드는 다음과 같이 사용한다.

   adoCmd.Parameters.Refresh
   adoCmd.Parameters.Item(1).Value = "
"

Refresh 메서드를 호출하기 위해서는 Command 개체의 ActiveConnection 속성을 유효한 Connection 개체로, CommandText 속성을 유효한 명령으로 그리고 CommandType 속성을 adCmdStoredProc로 설정해야 한다.

 

Parameter 개체

Parameter 개체는 저장 프로시저 또는 질의에 사용된 단일 매개변수에 대한 모든 정보를 나타내며, Parameters 컬렉션에 포함되어 사용된다.

Parameter 개체의 컬렉션, 메서드 및 속성을 사용하여 다음과 같은 작업을 할 수 있다.

   1. Name 속성을 사용하여 매개변수의 이름을 설정하거나 반환한다.
   2. Value
속성을 사용하여 매개변수의 값을 설정하거나 반환한다.
   3. Attributes
속성과 Direction, Precision, NumericScale, Size Type 속성을 사용하여 매개변수의 특성을 설정하거나 반환한다.
   4. AppendChunk
메서드를 사용하여 긴 이진 데이터 또는 문자 데이터를 매개 변수에 전달한다.

호출하려는 저장 프로시저나 질의에 대한 매개변수의 이름과 속성을 알고 있다면 CreateParameter 메서드를 사용하여 적절한 속성 설정 값에 따라 여러 개의 Parameter 개체를 작성하고 Append 메서드를 사용하여 이들 개체를 Parameters 컬렉션에 추가할 수 있다. 이렇게 하면 공급자로부터 매개변수에 대한 정보를 검색하기 위해 Parameters 컬렉션에서 Refresh 메서드를 호출하는 등의 리소스 집약적인 작업을 하지 않아도 매개 변수의 값을 설정하거나 반환할 수 있다.

Parameter 개체의 속성

속성

설명

기본 값

데이터 형식

Attributes

Parameter 개체의 특성을 나타낸다. (읽기/쓰기)

0

Long

Direction

Parameter 개체가 입력 매개변수를 나타내는지, 출력 매개변수를 나타내는지, 양쪽 모두를 나타내는지 또는 매개변수가 저장 프로시저에서 반환되는 값인지의 여부를 나타낸다. (읽기/쓰기)

1

ParameterDirectionEnum

Name

Parameter 개체의 이름을 나타낸다. (읽기/쓰기)

""

String

NumericScale

NumericScale 속성은 Parameter 개체의 숫자 값의 단위를 나타낸다. (읽기/쓰기)

0

Byte

Precision

Parameter 개체의 숫자 값에 대한 정밀도를 나타낸다. (읽기/쓰기)

0

Byte

Size

Parameter 개체의 최대 크기를 바이트나 문자 개수로 나타낸다. (읽기/쓰기)

0

Long

Type

Parameter 개체의 데이터 형식을 나타낸다. (읽기/쓰기)

0

DataTypeEnum

Value

Parameter 개체에 지정된 값을 나타낸다.

Type 속성에 따라 달라진다.

Variant

Attribute 속성

Attribute 속성은 Parameter 개체에 대한 하나 이상의 특성을 나타내며, ParameterAttributesEnum 값 중에서 하나 이상 값들의 합일 수 있다.

속성

설명

adParamSigned

디폴트 값. 매개변수에 부호 있는 값이 사용되었음을 나타낸다.

adParamNullable

매개변수에 Null 값이 사용되었음을 나타낸다.

adParamLong

매개변수에 긴 이진 데이터가 사용되었음을 나타낸다.

Direction 속성

Direction 속성은 Parameter 개체가 입력 매개변수를 나타내는지, 출력 매개변수를 나타내는지, 양쪽 모두를 나타내는지 또는 매개변수가 저장 프로시저에서 반환되는 값인지의 여부를 나타낸다.

이 속성은 다음과 같은 ParameterDirectionEnum 값 중 하나를 설정하거나 반환한다.

상수

설명

adParamUnknown

0

매개변수의 Direction 속성을 알 수 없음을 나타낸다.

adParamInput

1

디폴트 값. 입력 매개변수를 나타낸다.

adParamOutput

2

출력 매개변수를 나타낸다.

adParamInputOutput

3

입력 매개변수와 출력 매개변수 모두를 나타낸다.

adParamReturnValue

4

반환 값을 나타낸다.

Name 속성

Name 속성은 Parameter 개체의 이름을 나타낸다. 이 속성은 읽기와 쓰기가 모두 가능하며 String 값을 반환하거나 설정한다.

Parameters 컬렉션에 아직 추가되지 않은 Parameter 개체의 이 속성은 읽기/쓰기가 가능하며, Parameter 개체가 추가된 후에는 이 속성은 읽기 전용이다. Parameters 컬렉션 내의 개체들의 이름이 모두 고유한 이름을 가질 필요는 없다.

이 속성은 저장 프로시저 또는 질의에서 정의한 매개변수의 이름과 동일하지 않아도 상관없다. 하지만, 프로그램의 유지보수나 판독력을 높이기 위해 동일하게 작성하는 것을 권장한다.

NumericScale 속성

NumericScale 속성은 Parameter 개체의 숫자 값의 단위를 나타낸다. 이 속성은 Byte 값을 설정하거나 반환하며, 숫자 값이 들어갈 소수 자릿수를 나타낸다. 이 속성은 읽기와 쓰기가 가능하다.

NumericScale 속성을 사용하여 숫자로 된 Parameter 개체의 값을 나타낼 때 소수점 이하 몇 자리까지 사용할지를 결정한다.

Precision 속성

Precision 속성은 Parameter 개체의 숫자 값에 대한 정밀도를 나타낸다. 이 속성은 읽기와 쓰기가 가능하며, Byte 값을 설정하거나 반환한다.

이 속성을 사용하여 숫자로 된 Parameter 개체에 대한 값을 나타낼 때 사용할 최대 자릿수를 결정한다.

Size 속성

Size 속성은 Parameter 개체의 최대 크기를 바이트나 문자 개수로 나타내며, Long 값을 설정하거나 반환한다.

이 속성을 사용하여 Parameter 개체의 Value 속성에 기록될 최대값 또는 이 속성에서 읽을 최대값을 결정하며, 이 속성은 읽기와 쓰기가 모두 가능하다.

Parameter 개체에 대해 가변 길이 데이터 형식(예를 들어, adVarChar와 같은 String 형식)을 지정할 경우, Parameters 컬렉션에 개체를 추가하기 전에 먼저 개체의 Size 속성을 설정해야 하며 그렇지 않을 경우에는 오류가 발생한다.

   adoPara.Type = adVarChar
   'adoPara.Size = 50
   adoPara.Direction = adParamInput
   adoPara.Value = ""
   adoCmd.Parameters.Append adoPara

위와 같이 Size를 지정하지 않으면, 다음과 같은 오류가 발생한다.


[
그림] Size를 지정하지 않으면 발생하는 오류 메시지

Command 개체의 Parameters 컬렉션에 이미 Parameter 개체를 추가한 상태에서 개체 형식을 가변 길이 데이터 형식으로 변경할 경우에는 Command 개체를 실행하기 전에 먼저 Parameter 개체의 Size 속성을 설정해야 하며 그렇지 않을 경우에도 오류가 발생한다.

공급자로부터 매개 변수 정보를 얻기 위해 Refresh 메서드를 사용하고 공급자가 하나 이상의 가변 길이 데이터 형식 Parameter 개체를 반환하는 경우, ADO는 이들 매개 변수의 최대 예상 크기에 따라 매개 변수에 메모리를 할당하게 되므로 실행 중 오류가 발생할 수 있다. 오류를 방지하려면 명령을 실행하기 전에 먼저 이들 매개 변수에 대한 Size 속성을 명시적으로 설정해야 한다.

Type 속성

Type 속성은 Parameter 개체의 데이터 형식을 나타내며, 읽기와 쓰기가 모두 가능하다.

이 속성은 다음과 같은 DataTypeEnum 값 중 하나를 설정하거나 반환한다. DataTypeEnum 값은 다음과 같다.

상수

설명

adBigInt

20

8 바이트의 부호 있는 정수(DBTYPE_I8)를 나타낸다.

adBinary

128

이진 값(DBTYPE_BYTES)을 나타낸다.

adBoolean

11

Boolean (DBTYPE_BOOL)을 나타낸다.

adBSTR

8

Null 종결 문자열(유니코드)(DBTYPE_BSTR)을 나타낸다.

adChapter

136

Child RowSet에서 Row를 식별하기 위해서 사용되는 4 바이트 Chapter (DBTYPE_HCHAPTER)을 나타낸다.

adChar

129

String (DBTYPE_STR)을 나타낸다.

adCurrency

6

Currency (DBTYPE_CY)을 나타낸다. Currency는 소수점 이하의 자릿수가 4개인 고정 자릿수이다. 이 값은 10,000으로 환산된 8바이트의 부호 있는 정수로 저장된다.

adDate

7

Date (DBTYPE_DATE)을 나타낸다. 날짜는 Double 형식으로 저장되며, 정수 부분은 1899 12 30일 이후의 날짜수이며 소수 부분은 하루 중 시간을 나타낸다.

adDBDate

133

날짜 값(yyyymmdd)(DBTYPE_DBDATE)을 나타낸다.

adDBFileTime

137

파일-시간 값(DBTYPE_DBFILETIME)을 나타낸다.

adDBTime

134

시간 값(hhmmss)(DBTYPE_DBTIME)을 나타낸다.

adDBTimeStamp

135

날짜-시간 스탬프(yyyymmddhhmmss 10억분의 1초 단위가 추가된)(DBTYPE_DBTIMESTAMP)를 나타낸다.

adDecimal

14

고정 정밀도와 크기로 나타낸 정확한 숫자 값(DBTYPE_DECIMAL)을 나타낸다.

adDouble

5

배정도의 부동 소수점 값(DBTYPE_R8)을 나타낸다.

adEmpty

0

지정된 값 없음(DBTYPE_EMPTY)을 나타낸다.

adError

10

32 비트 오류 코드(DBTYPE_ERROR)를 나타낸다.

adFileTime

64

1601 1 1일 이후의 1000만분의 1초 간격의 숫자를 표현하는 64 비트 값(DBTYPE_FILETIME)을 나타낸다.

adGUID

72

전역 고유 식별자(GUID)(DBTYPE_GUID)를 나타낸다.

adIDispatch

9

OLE 개체에서 IDispatch 인터페이스에 대한 포인터(DBTYPE_IDISPATCH)를 나타낸다.참고 이 데이터 형식은 ADO에 의해서 현재는 지원되지 않는다. 이 데이터 형식의 사용은 예기치 않은 결과를 초래할 수 있다.

adInteger

3

4바이트의 부호 있는 정수(DBTYPE_I4)를 나타낸다.

adIUnknown

13

OLE 개체에서 IUnknown 인터페이스에 대한 포인터(DBTYPE_IUNKNOWN)를 나타낸다.참고 이 데이터 형식은 ADO에 의해서 현재는 지원되지 않는다. 이 데이터 형식의 사용은 예기치 않은 결과를 초래할 수 있다.

adLongVarBinary

205

Long 이진 값(Parameter 개체만 해당)을 나타낸다.

adLongVarChar

201

Long String (Parameter 개체만 해당)을 나타낸다.

adLongVarWChar

203

Long Null 종결 문자열 값(Parameter 개체만 해당)을 나타낸다.

adNumeric

131

고정 정밀도와 크기로 나타낸 정확한 숫자 값(DBTYPE_NUMERIC)을 나타낸다.

adPropVariant

138

자동화 PROPVARIANT(DBTYPE_PROP_VARIANT)를 나타낸다.

adSingle

4

단정도의 부동 소수점 값(DBTYPE_R4)을 나타낸다.

adSmallInt

2

2 바이트의 부호 있는 정수(DBTYPE_I2)를 나타낸다.

adTinyInt

16

1 바이트의 부호 있는 정수(DBTYPE_I1)를 나타낸다.

adUnsignedBigInt

21

8 바이트의 부호 없는 정수(DBTYPE_UI8)를 나타낸다.

adUnsignedInt

19

4 바이트의 부호 없는 정수(DBTYPE_UI4)를 나타낸다.

adUnsignedSmallInt

18

2 바이트의 부호 없는 정수(DBTYPE_UI2)를 나타낸다.

adUnsignedTinyInt

17

1 바이트의 부호 없는 정수(DBTYPE_UI1)를 나타낸다.

adUserDefined

132

사용자 정의 변수(DBTYPE_UDT)를 나타낸다.

adVarBinary

204

이진 값(Parameter 개체만 해당)을 나타낸다.

adVarChar

200

String (Parameter 개체만 해당)을 나타낸다.

adVariant

12

자동화 Variant(DBTYPE_VARIANT)를 나타낸다.

adVarNumeric

139

숫자 값(Parameter 개체만 해당)을 나타낸다.

adVarWChar

202

Null 종결 유니코드 문자열(Parameter 개체만 해당)을 나타낸다.

adWChar

130

Null 종결 유니코드 문자열(DBTYPE_WSTR)을 나타낸다.

다음 표는 SQL 서버의 데이터 형식과 액세스의 데이터 형식을 나열한 것이며, 빈 공간은 두 데이터 형식이 직접적으로 맵핑되지 않는 것을 의미한다.

SQL 서버

액세스

Enum

binary

Binary

adVarBinary

varbinary

 

adVarBinary

char

Text

adVarChar

varchar

 

adVarChar

datetime

 

adDBTimeStamp

smalldatetime

 

adDBTimeStamp

float

Single

adSingle

real

 

adSingle

int

Long Integer

adInteger

smallint

Integer

adSmallInt

tinyint

Byte

adUnsignedTinyInt

Money

Currency

adCurrency

smallmoney

 

adCurrency

bit

Yes/No

adBoolean

timestamp

 

adVarBinary

text

Memo

adVarChar

image

OLE Object

adVarBinary

 

Double

adDouble

 

Date/Time

adDate

 

Replication ID

adGUID

 

Value

adEmpty

데이터 형식을 지정할 때 실수하기 쉬운 부분은 SQL 서버의 datetime 형식은 adDate가 아니라 adDBTimeStamp로 지정해야 한다는 것이다.

Value 속성

Value 속성을 사용하여 매개 변수 값을 설정 또는 반환하며, Value 속성의 읽기/쓰기 또는 읽기 전용 여부를 결정하는 요소에는 여러 가지가 있다.

ADO에서는 Value 속성으로 Long 이진 데이터를 설정하고 반환할 수 있다.

참고

Parameter 개체에 대해 ADO Provider로부터 Value 속성을 한 번만 읽는다. Parameter 개체의 Value 속성이 비어 있고, Recordset 개체를 생성하는 Command 개체인 경우 Value 속성을 검색하기 전에 먼저 Recordset 개체를 닫아야 한다. 그렇게 하지 않으면 일부 Provider에 대해 Value 속성이 비어 있을 수 있으며 정확한 값을 포함하지 않게 된다.

Parameter 개체의 메서드

메서드

설명

AppendChunk

Parameter 개체에 데이터를 추가한다.

Append 메서드

Append 메서드는 Parameter 개체에 데이터를 추가하는 메서드이며, 구문은 다음과 같다.

   Parameter.AppendChunk Data

여기에서 Data Variant 형식으로 Parameter 개체에 추가할 데이터이다.

Parameter 개체의 Attributes 속성 중에 adFldLong 비트가 True로 설정되어 있으면 해당 매개 변수에 대하여 AppendChunk 메서드를 사용할 수 있다.
Parameter
개체에서 AppendChunk를 처음 호출하면 이 매개 변수에 데이터가 기록되며 기존 데이터를 겹쳐 쓴다. 그런 다음 Parameter 개체에서 AppendChunk를 다시 호출하면 기존의 매개 변수 데이터에 추가된다.
그리고 Null 값을 전달하는 AppendChunk를 호출하면 모든 매개 변수 데이터가 삭제된다.

 

4 Command 개체의 메서드

메서드

설명

Cancel

실행 중인 명령을 중지한다.

CreateParameter

새로운 Parameter 개체를 생성한다.

Execute

명령을 실행한다.

Cancel 메서드

Cancel 메서드는 비동기적으로 실행 중인 Execute 메서드를 중지시킬 때 사용하는 메서드이다. Cancel 메서드를 사용하기 위해서는 Execute 메서드에서 adAsyncExecute 옵션을 사용해야만 한다. 비동기적으로 Execute 메서드를 사용하지 않은 상태에서 Cancel 메서드를 사용하면 오류가 발생한다.

[예제]

다음 예제는 Command 개체를 비동기적으로 실행한 후에 0부터 10까지 루프를 수행하면서 시간을 지연시킨 다음, 아직도 Command 개체가 수행 중이면, 작업을 취소하는 예이다.

Public Sub cmdCancel_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoCmd As New ADODB.Command
   Dim strConn As String
   Dim strCmd As String
   Dim i As Integer

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "
   adoCn.Open strConn

   strCmd = "UPDATE Titles SET Type = 'self_help' " & _
            "WHERE Type = 'psychology'"

   adoCmd.ActiveConnection = adoCn
   adoCmd.CommandText = strCmd

   adoCmd.Execute strCmd, , adAsyncExecute

   '
시간을 지연시키기 위한 코드
   For i = 0 To 10
      Debug.Print i
   Next i

   If CBool(adoCmd.State And adStateExecuting) Then
      adoCmd.Cancel

      MsgBox "Update
취소"
   Else
      MsgBox "Update
완료"
   End If

   adoCn.Close
   Set adoCn = Nothing
End Sub

Cancel 메서드는 오랜 작업 시간을 요구하는 질의를 수행하는 경우에 해당 화면에 Cancel 메서드를 수행하는 명령 버튼을 제공할 때 사용한다.

CreateParameter 메서드

CreateParameter 메서드는 새로운 Parameter 개체를 생성할 때 사용되는 메서드이며, 구문은 다음과 같다.

   Set parameter = Command.CreateParameter (Name, Type, Direction, Size, Value)

매개변수는 다음과 같다.

매개변수

형식

설명

Name

String

선택사항. Parameter 개체의 이름을 지정하는 문자열이다

Type

DataTypeEnum

선택사항. Parameter 개체의 데이터 형식을 지정하는 매개변수이며, 데이터 형식은 Long 이다. 정확한 설정을 위해서는 Parameter 개체의 Type 속성을 참조한다.

Direction

ParameterDirectionEnum

선택사항. Parameter 개체의 형식을 지정하는 매개변수이며, 데이터 형식은 Long 이다. 정확한 설정을 위해서는 Parameter 개체의 Direction 속성을 참조한다.

Size

Long

선택사항. 문자 또는 바이트 단위로 매개 변수 값의 최대 길이를 지정하는 매개 변수이며 데이터 형식은 Long 이다.

Value

Variant

선택사항. Parameter 개체의 값을 지정하는 매개 변수이며 데이터 형식은 Variant 이다.

CreateParameter 메서드를 사용해서 새로운 Parameter 개체를 생성하면, Name, Type, Direction, Size, Value의 값들이 생성된 Parameter 개체의 해당 속성에 지정된다.

CreateParameter 메서드를 사용하는 방법에는 두 가지가 있으며, 첫번째는 다음과 같다.

   Set adoPara = adoCmd.CreateParameter("Percentage", adInteger, adParamInput, 8, iRoyalty)

두 번째는 다음과 같이 매개변수로 값을 지정하는 것이 아니라 속성으로 값을 지정한다.

   Set adoPara = adoCmd.CreateParameter
   adoPara.Name = "Percentage"
   adoPara.Type = adInteger
   adoPara.Direction = adParamInput
   adoPara.Size = 8
   adoPara.Value = iRoyalty

위의 두 코드는 동일하게 수행된다.

새로운 Parameter 개체를 생성하면, 이것이 Command 개체의 Parameters 컬렉션에 자동으로 추가되는 것이 아니기 때문에 Appned 메서드를 사용해서 Parameters 컬렉션에 추가시켜야 한다.

만약 Type 속성에 가변 길이 데이터 형식을 지정했다면, Size 인수를 지정하든지, 또는 새로 생성한 Parameter 개체를 Parameters 컬렉션에 추가하기 전에 Parameter 개체의 Size 속성에 값을 설정해야만 오류가 발생하지 않는다.

[예제]

다음 예제는 CreateParameter 메서드를 사용해서 Pubs 데이터베이스의 byroyalty라는 저장 프로시저를 수행하는 예이다.

Public Sub cmdCreateParameter_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoCmd As New ADODB.Command
   Dim adoPara As New ADODB.Parameter
   Dim adoRs As New ADODB.Recordset
   Dim iRoyalty As Integer
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adoCn.Open strConn
   adoCn.CursorLocation = adUseClient

   adoCmd.CommandText = "byroyalty"
   adoCmd.CommandType = adCmdStoredProc

   '
매개변수 값을 받아서 Parameter를 추가한다.
   iRoyalty = Trim(InputBox("Royalty
입력:"))

   Set adoPara = adoCmd.CreateParameter("Percentage", adInteger, adParamInput, 8, iRoyalty)
   adoCmd.Parameters.Append adoPara

   Set adoCmd.ActiveConnection = adoCn
   Set adoRs = adoCmd.Execute

   Debug.Print "Authors with " & iRoyalty & " percent royalty"

   Do While Not adoRs.EOF
      Debug.Print adoRs!au_id

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoRs = Nothing
End Sub

Execute 메서드

Execute 메서드는 CommandText 속성에 지정된, SQL 문장 또는 저장 프로시저를 실행하는 메서드이며, 구문은 다음과 같다.

레코드를 반환하도록 실행하기 위해서는 다음과 같이 코드를 작성한다.
Set recordset = Cmmand.Execute( RecordsAffected, Parameters, Options )

레코드를 반환하지 않도록 실행하기 위해서는 다음과 같이 코드를 작성한다.
   Command.Execute RecordsAffected, Parameters, Options

매개변수는 다음과 같다

매개변수

형식

설명

RecordsAffected

Long

선택사항. Execute 메서드를 통해서 실행된 명령에 의해서 변경된 레코드의 개수를 나타낸다. 예를 들어 Insert 문장에 의해서 5개의 레코드가 삽입되었다면 5를 반환한다.

Parameters

Variant

실행될 SQL 문장에 전달될 매개변수들의 값을 가진 Variant 배열이다.

Options

Long

선택사항. Provider Command 개체의 ComandText 속성의 값을 어떻게 처리할 지를 지정하는 상수이며, 다음 표의 값들 중 하나를 지정할 수 있다.

다음 표는 Options 매개변수에 지정할 수 있는 값을 나타낸다.

상수

설명

adCmdText

1

Provider CommandText 속성의 값을 SQL 문장과 같은 텍스트로 이루어진 명령어로 평가하도록 지정한다.

adCmdTable

2

ADO CommandText 속성에 지정된 테이블의 모든 레코드를 반환하도록 SQL 문장을 생성하도록 지정한다.

adCmdTableDirect

512

CommandText 속성에 지정된 테이블의 모든 레코드를 반환하도록 지정한다.

adCmdStoredProc

4

Provider CommandText 속성의 값을 저장 프로시저로 평가하도록 지정한다.

adCmdUnknown

8

CommandText 속성의 값이 어떤 명령을 지정하는지 알 수 없도록 지정한다.

adAsyncExecute

16

명령을 비동기적으로 처리하도록 지정한다.

adAsyncFetch

32

CacheSize 속성에 지정된 만큼의 초기 레코드를 가져온 후에 남아 있는 레코드를 비동기적으로 처리하도록 지정한다.

Command 개체의 Execute 메서드는 CommandText 속성에 지정된 SQL 문장이나 테이블, 또는 저장 프로시저를 실행해서 Recordset 개체를 생성하는데 사용된다. 만약 Recordset 개체를 반환하지 않도록 처리하면, 닫혀진 Recordset 개체가 반환된다.

Command 개체를 사용해서 반환되는 Recordset 개체는 디폴트 Recordset 개체로서 CursorLocation 속성은 adUseServer(2) 이며, CursorType 속성은 adOpenForwardOnly(0) 이며, LockType 속성은 adLockReadOnly(1) 이다.

[예제]

다음 예제는 Pubs 데이터베이스의 Titles 테이블의 필드를 변경하는 SQL 문장을 수행하는 예이다.

Private Sub cmdExecute_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoCmd As New ADODB.Command
   Dim adoErr As Object
   Dim Sql As String
   Dim strConn As String

   On Error GoTo ErrTrap

   Sql = "UPDATE Titles SET Type = " & _
         "'self_help' WHERE Type = 'psychology'"

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adoCn.Open strConn

   Set adoCmd.ActiveConnection = adoCn
   adoCmd.CommandText = Sql

   adoCmd.Execute

   adoCn.Close
   Set adoCn = Nothing

   Exit Sub

ErrTrap:
   If adoCn.Errors.Count > 0 Then
      For Each adoErr In adoCn.Errors
         MsgBox "
오류 번호: " & adoErr.Number & vbCr & adoErr.Description
      Next adoErr
   End If

   Resume Next
End Sub

참고

Connection 개체와 Recordset 개체는 이벤트를 가지고 있지만, Command 개체는 이벤트를 가지고 있지 않다

비동기적으로 Execute 메서드를 사용할 경우에는 Options 매개변수의 값으로 adAsyncExecute를 사용할 수 있다. 예제 코드는 다음과 같다.

   adoCmd.Execute , , adCmdTable Or adAsyncExecute Or adAsyncFetch

 

Recordset 개체는 테이블 또는 명령의 실행으로 생성된 레코드의 집합이며, 한번에 한 레코드씩 읽을 수 있다.

ADO Recordset 개체는 DAO(Data Access Object) Recordset 개체와 RDO(Remote Data Object) rdoResultset 개체와 같은 기능을 제공하는 개체로서 이전 버전보다 보다 강력하고 다양한 기능을 제공한다.

Recordset 개체를 사용하기 위해서는 다음과 같이 선언한다.

   Dim adoRs As ADODB.Recordset
   Set adoRs = New ADODB.Recordset

Recordset 개체는 Provider로 부터 제공된 데이터를 조작하는데 사용되어지며, 레코드(Rows)와 필드(Columns)로 구성되어 있다. Recordset 개체의 메서드와 속성은 Provider에 의해서 제공되며, 특정 Provider에서는 제공되지 않는 메서드나 속성들도 있다.

ADOR.Recordset ADODB.Recordset은 동일한 기능을 하는 개체이며, ADODB.Recordset 개체는 ADO에 의해서 제공되어지는 것이고, ADOR.Recordset은 인터넷 익스플로러에 의해서 제공되는 개체이다.

1 Recordset 개체의 속성

속성

설명

데이터 형식

AbsolutePage

현재 레코드가 위치한 페이지를 나타낸다.

Long

AbsolutePosition

현재 레코드의 위치를 나타낸다.

Long

ActiveCommand

Recordset 개체를 생성한 Command 개체를 나타낸다. (읽기전용)

Object

ActiveConnection

Recordset 개체가 속한 Connection 개체를 나타낸다.

Variant

BOF

현재 레코드의 위치가 Recordset 개체의 맨 처음 레코드의 이전에 있음을 나타낸다.

Boolean

Bookmark

현재 레코드의 위치를 저장하거나 특정 레코드의 위치를 지정할 때 사용되는 속성

Variant

CacheSize

Recordset 개체로부터 로컬 메모리로 레코드를 가져올 때 한번에 가져올 레코드의 개수를 나타낸다.

Long

CursorLocation

커서 엔진의 위치를 지정한다.

Long

CursorType

Recordset 개체의 커서 타입을 지정한다.

CursorTypeEnum

DataMember

DataSource 속성이 참조하는 개체에서 검색할 데이터 구성원의 이름을 나타낸다.

String

DataSource

Recordset 개체로 나타낼 데이터를 포함하는 개체를 지정한다.

Object

EditMode

현재 레코드의 편집 상태를 나타낸다.

EditModeEnum

EOF

현재 레코드의 위치가 Recordset 개체의 맨 마지막 레코드의 다음에 있음을 나타낸다.

Boolean

Fields

Field의 컬렉션

 

Filter

Recordset 개체 내의 데이터에 대한 필터를 나타낸다.

Variant

LockType

Recordset 개체 내의 레코드를 편집할 동안 해당 레코드에 설정할 Lock 타입을 나타낸다.

LockTypeEnum

MarchalOptions

이 속성은 서버로 다시 마샬링될 레코드를 나타낸다

Long

MaxRecords

하나의 질의에서 Recordset에 반환되는 레코드 개수의 최대값을 나타낸다.

Long

PageCount

Recordset 개체에 들어 있는 데이터의 페이지 수를 나타낸다.

Long

PageSize

Recordset에서 페이지 하나를 구성하는 레코드 수를 나타낸다.

Long

Properties

Properties 속성은 Properties 컬렉션을 나타내며, 이 컬렉션은 한 개체의 특정 인스턴스에 대한 모든 Property 개체들을 포함한다.(읽기 전용)

Properties 컬렉션

RecordCount

Recordset 개체의 현재 레코드 수를 나타낸다

Long

Sort

Recordset 개체를 정렬할 하나 이상의 필드 이름을 지정하고, 각 필드를 오름차순 또는 내림차순으로 정렬할지 여부를 지정한다.

String

Source

Recordset 개체에 있는 데이터에 대한 원본(Command 개체, SQL , 테이블 이름 또는 저장 프로시저)을 나타낸다.

Variant

State

사용할 수 있는 모든 개체에 대해 이들 개체의 상태가 열려 있는지 또는 닫혀 있는지 여부를 설명한다.

Long

Status

일괄 업데이트 또는 기타 대량 작업과 관련된 현재 레코드의 상태를 나타낸다

Long

StayInSync

계층적 Recordset 개체에서 기본 하위 레코드 집합(: )이 변경될 때 상위 행도 변경되어야 하는지를 나타낸다.

Boolean

AbsolutPage 속성

AbsolutePage 속성은 현재의 레코드가 위치한 페이지를 나타내는 속성이다. 1 PageCount 속성값 사이의 Long 형식의 값을 가지거나 아래의 상수 값을 갖는다. 읽기와 쓰기가 모두 가능하다.

AbsolutePage 속성은 다음 값 중 하나를 반환한다.

상수

설명

AdPosUnknown

Recordset 개체가 Empty이어서 현재 레코드의 위치를 알 수 없을 경우, 또는 Provider AbsolutPosition 속성을 지원하지 않는 경우이다.

AdPosBOF

현재 레코드의 위치가 BOF인 경우, BOF 속성이 True이다.

AdPosEOF

현재 레코드의 위치가 EOF인 경우, EOF 속성이 True이다.

ADO Recordset 개체는 PageSize 속성에 의해서 동일한 개수의 레코드로 나누어져서 AbsolutePage를 갖는다. PageSize 속성을 사용해서 논리적으로 Recordset 개체를 일련의 페이지로 분할할 수 있다.
AbosolutPosition
속성은 레코드의 위치를 나타내는 것이며, PageCount 속성은 전체 페이지의 개수를 나타낸다.
이 속성을 사용하기 위해서 Provider가 적절한 기능을 제공해야 하며, 그렇지 못할 경우에는 -1 값을 반환한다.

[예제]

다음 예제는 생성된 Recordset 개체의 레코드를 5개 단위로 나누어서 AbsolutePage 속성을 지정하는 예이다. 여기에서 한 가지 주의할 것은 PageCount 속성을 사용하기 위해서 CursorLocation adUseClient로 지정해야 된다는 것이다. CursorLocation 속성을 adUseServer로 지정하면 PageCount 속성은 -1을 반환한다.

Private Sub cmdAbsolutePage_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String
   Dim strMsg As String
   Dim iPage As Integer
   Dim iPageCount As Integer
   Dim iRecord As Integer

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset

   adoRs.CursorLocation = adUseClient
   adoRs.Open "Employee", strConn, , , adCmdTable

   adoRs.PageSize = 5

   iPageCount = adoRs.PageCount

   For iPage = 1 To iPageCount
      adoRs.AbsolutePage = iPage
      strMsg = ""

   For iRecord = 1 To adoRs.PageSize
      strMsg = strMsg & adoRs!fname & " " & _
            adoRs!lname & " " & adoRs!hire_date & vbCr

         adoRs.MoveNext

         If adoRs.EOF Then Exit For
      Next iRecord

      MsgBox strMsg
   Next iPage

   adoRs.Close
   Set adoRs = Nothing
End Sub

AbsolutePosition 속성

AbsolutePosition 속성은 Recordset 개체 내에서 현재의 레코드가 물리적으로 몇 번째에 위치하고 있는지를 나타내는 속성이다. 1에서 RecordCount 속성값 사이의 Long 타입의 값을 가지거나, 다음의 상수값을 갖는다. 그리고 읽기와 쓰기가 모두 가능하다.

상수

설명

AdPosUnknown

Recordset 개체가 Empty이어서 현재 레코드의 위치를 알 수 없을 경우, 또는 Provider AbsolutPosition 속성을 지원하지 않는 경우

AdPosBOF

현재 레코드의 위치가 BOF인 경우, BOF 속성이 True이다.

AdPosEOF

현재 레코드의 위치가 EOF인 경우, EOF 속성이 True이다.

AbsolutePosition 속성은 특정 레코드로 이동하거나, 현재의 레코드의 위치를 알아내고자 할 때 사용된다. AbsolutePage 속성과 동일하게 1부터 시작하며, 생성된 Recordset 개체에 포함된 레코드의 개수는 RecordCount 속성을 이용해서 알 수 있다.

AbsolutePosition 속성에 값을 지정하면, 현재의 캐쉬에 레코드가 있더라도, 새로이 지정한 위치의 레코드 그룹을 캐쉬로 읽어 들인다. 이렇게 읽어들인 그룹의 크기는 CacheSize 속성에 의해서 지정된다.

일반적으로 AbsolutePosition 속성은 특정 레코드를 기억하기 위해서 사용하는 것은 바람직하지 못하다. 이유는 현재 레코드의 AbsolutePosition 속성의 값을 읽은 다음에 Recordset 개체에 새로운 레코드가 추가되거나 삭제된다면, AbsolutePosition 속성이 기억하고 있는 레코드는 다른 레코드일 것이다. 이런 이유로 특정 레코드를 기억하기 위해서는 Bookmark 속성을 주로 사용한다.

이 속성을 사용하기 위해서 Provider가 적절한 기능을 제공해야 하며, 그렇지 못할 경우에는 -1 값을 반환한다.

[예제]

다음 예제는 Pubs 데이터베이스의 Employee 테이블의 레코드를 하나씩 메시지 박스로 보여주는 예이다.

Private Sub cmdAbsolutePosition_Click()
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String
   Dim strMsg As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   adoRs.CursorLocation = adUseClient
   adoRs.Open "Employee", strConn, , , adCmdTable

   Do While Not adoRs.EOF
      strMsg = "Employee: " & adoRs!lName & vbCr & _
         "(" & adoRs.RecordCount & "
레코드 중 " & adoRs.AbsolutePosition & "번째)"

      If MsgBox(strMsg, vbOKCancel) = vbCancel Then Exit Do

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing
End Sub

ActiveCommand 속성

ActiveCommand 속성은 연관된 Recordset 개체를 생성한 Command 개체를 나타낸다. 이 속성은 Command 개체가 포함된 Variant를 반환하며, 기본 값은 Null 개체 참조이다.

이 속성은 읽기 전용이며, 현재 Recordset 개체를 생성할 때 Command 개체를 사용하지 않았다면 Null 개체 참조가 반환된다.

Command 개체로부터 생성된 Recordset 개체의 이 속성을 사용하면 연관된 Command 개체의 정보를 알 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 저장 프로시정 byroyalty를 실행한 후 생성한 Recordset 개체의 ActiveCommand 속성을 보여주는 예이다.

Private Sub cmdActiveCommand_Click()
   Dim adocn As New ADODB.Connection
   Dim adoCmd As New ADODB.Command
   Dim adoPara As New ADODB.Parameter
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   adocn.Open strConn

   Set adoCmd.ActiveConnection = adocn

   adoCmd.CommandText = "byroyalty"
   adoCmd.CommandType = adCmdStoredProc
   adoCmd.CommandTimeout = 15

   adoPara.Type = adInteger
   adoPara.Direction = adParamInput
   adoPara.Value = 100
   adoCmd.Parameters.Append adoPara

   '
명령을 실행해서 Recordset 개체 생성
   Set adoRs = adoCmd.Execute()

   Debug.Print "ActiveCommand : " & adoRs.ActiveCommand.CommandText

   adoRs.Close
   Set adoRs = Nothing

   Set adoCmd = Nothing

   adocn.Close
   Set adocn = Nothing
End Sub

ActiveConnection 속성

ActiveConnection 속성은 현재의 Recordset 개체가 속해 있는 Connection 개체를 나타낸다. 이 속성은 연결을 위한 정보를 문자열로 지정하거나, Connection 개체를 지정할 수 있으며, 기본값은 Null 개체이다.

ActiveConnection 속성은 Recordset 개체가 이미 생성되었거나, Recordset 개체의 Source 속성에 유효한 Command 개체가 지정되었다면 읽기 전용이며, Recordset 개체가 아직 열려지지 않았다면 읽기, 쓰기가 모두 가능하다.

Recordset 개체의 Open 메서드에서 ActiveConnection 인수를 지정하면, 그 인수의 값이 Recordset 개체의 ActiveConnection 속성으로 상속된다. 또한 Recordset 개체의 Source 속성에 유효한 Command 개체를 지정할 경우에는 Recordset 개체의 ActiveConnection 속성은 Command 개체의 ActiveConnection 속성의 값을 상속받는다.

Remote Data Service 환경에서 클라이언트 사이드 Recordset 개체를 사용할 경우 이 속성은 ConnectionString 또는 Nothing 만을 지정할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스에 접속하는 예이다.

Private Sub cmdActiveConnection_Click()
   Dim adoCn As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   adoCn.Open strConn

   adoRs.Open "Authors", adoCn, , , adCmdTable

   Do While Not adoRs.EOF
      Debug.Print adoRs!au_lname

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

BOF, EOF 속성

BOF 속성은 현재 레코드의 위치가 Recordset 개체의 처음 레코드의 이전에 위치했을 때 True(-1) 값을 가지며, 그 외의 경우에는 False(0) 값을 가진다.

EOF 속성은 현재 레코드의 위치가 Recordset 개체의 마지막 레코드의 다음에 위치했을 때 True(-1) 값을 가지며, 그 외의 경우에는 False(0) 값을 가진다.

만약에 BOF EOF 속성이 모두 True이면, 현재의 Recordset 개체에는 레코드가 하나도 없음을 나타낸다.
Recordset
개체를 생성했을 때 레코드가 하나라도 있다면 BOF EOF 속성은 False 이다.

만약 레코드가 하나 밖에 없을 경우에 그 마지막 레코드를 삭제한다며, BOF EOF 속성은 여전히 False 값을 가지며, 다른 레코드로 이동하려고 시도할 때 True로 바뀌게 된다.

만약 Recordset 개체에 레코드가 하나도 없다면 RecordCount 속성이 0이 된다.

다음의 테이블은 BOF EOF 속성의 조합에 따라 Move 메서드의 결과가 달라짐을 보여준다.

 

MoveFirst,MoveLast

MovePrevious,Move <0

Move 0

MoveNext,Move > 0

BOF=True,EOF=False

가능

오류

오류

가능

BOF=False,EOF=True

가능

가능

오류

오류

모두 True

오류

오류

오류

오류

모두 False

가능

가능

가능

가능

[예제]

다음 예제는 Pubs 데이터베이스의 publishers 테이블의 데이터를 Recordset 개체를 사용해서 검색하는 예이다.

Private Sub cmdBofEof_Click()
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String
   Dim strMessage As String
   Dim intCommand As Integer
   Dim varBookmark As Variant

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   adoRs.CursorType = adOpenStatic

   'AbsolutePosition
프로퍼티를 사용하기 위해서 클라이언트 CursorLocaiton을 지정한다.
   adoRs.CursorLocation = adUseClient

   adoRs.Open "SELECT pub_id, pub_name FROM publishers " & _
            "ORDER BY pub_name", strConn, , , adCmdText

   adoRs.MoveFirst

   Do While True
      strMessage = "Publisher : " & adoRs!pub_name & _
         vbCr & "(" & adoRs.RecordCount & "
개 중 " & _
         adoRs.AbsolutePosition & "
번째 레코드)" & vbCr & vbCr & _
         "
명령어를 입력하세요:" & vbCr & _
         "[1 -
다음(next) / 2 - 이전(previous) /" & vbCr & _
         "3 - bookmark
저장 / 4 - bookmark로 이동]"

      intCommand = Val(InputBox(strMessage))

      Select Case intCommand
         Case 1
            adoRs.MoveNext

            If adoRs.EOF Then
               MsgBox "
마지막 레코드 입니다." & vbCr & "다시 시도하세요"
               adoRs.MoveLast
            End If
         Case 2
            adoRs.MovePrevious

            If adoRs.BOF Then
               MsgBox "
처음 레코드 입니다." & vbCr & "다시 시도하세요"
               adoRs.MoveFirst
            End If
         Case 3
            varBookmark = adoRs.Bookmark
         Case 4
            If IsEmpty(varBookmark) Then
               MsgBox "
저장된 Bookmark가 없습니다.!"
            Else
               adoRs.Bookmark = varBookmark
            End If
         Case Else
            Exit Do
         End Select
   Loop

   adoRs.Close
   Set adoRs = Nothing
End Sub

Bookmark 속성

Bookmark 속성은 Recordset 개체의 레코드들 중에서 현재의 레코드를 식별하는 값이며, 현재 레코드의 위치를 저장하거나 특정 레코드의 위치를 지정할 때 사용되는 속성이다. DAO RDO에서는 Bookmark 속성의 데이터 형식이 String 이었지만, ADO에서는 Variant 이다.

Recordset 개체를 생성하면, 각각의 레코드는 유일한 Bookmark 값을 갖는다. 이 값을 변수에 저장했다가 다른 레코드로 이동한 후에 Recordset 개체의 Bookmark 속성에 이 변수의 값을 지정하면 해당 레코드의 위치로 이동하게 된다.

Bookmark 속성의 값은 사용자에게 보여지지 않으며, 동일한 레코드를 가리키는 두개의 Bookmark 값도 서로 다른 값을 갖는다.

만약 Clone 메서드를 사용해서 Recordset 개체의 복사본을 만들 경우에만, 두개의 Recordset 개체의 Bookmark 속성은 동일한 값을 갖는다. 하지만, 동일한 Source 또는 Command 개체로부터 Recordset 개체를 생성하더라도 두 Recordset 개체의 Bookmark 값은 서로 다르다.

Remote Data Service 환경에서 클라이언트 사이드 Recordset 개체를 사용할 경우에 Bookmark 속성은 사용 가능하다.

[예제]

다음 예제는 Recordset 개체의 Bookmark 속성의 값을 읽고 쓰는 예이다.

Private Sub cmdBookmark_Click()
   Dim adoRs As New ADODB.Recordset
   Dim adoRs2 As New ADODB.Recordset
   Dim strConn As String
   Dim varBookmark As Variant

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   adoRs.CursorType = adOpenStatic
   adoRs.CursorLocation = adUseClient

   adoRs.Open "SELECT pub_id, pub_name FROM publishers " & _
         "ORDER BY pub_name", strConn, , , adCmdText

   Set adoRs2 = adoRs.Clone

   adoRs.MoveLast
   adoRs.MovePrevious
   varBookmark = adoRs.Bookmark
   Debug.Print adoRs!pub_name

   adoRs2.Bookmark = varBookmark
   Debug.Print adoRs!pub_name

   adoRs.Close
   Set adoRs = Nothing
End Sub

CacheSize 속성

Recordset 개체로부터 로컬 메모리로 레코드를 가져올 때 한번에 가져올 레코드의 개수를 나타낸다. CacheSize 속성은 0 보다 큰 값을 가지며, 디폴트는 1이다.

이 속성은 Provider가 로컬 메모리의 버퍼에 몇 개의 레코드를 한번에 가지고 있을지를 결정하게 된다. 만약 CacheSize 속성이 10 이라면 Recordset 개체가 생성된 후에 Provider는 로컬 메모리에 10개의 레코드를 할당하게 된다.

만약 CacheSize 속성에 설정한 값보다 생성된 Recordset 개체에 포함된 레코드의 개수가 적다면 Provider는 생성된 Recordset 개체의 전체 레코드를 로컬 메모리로 할당하게 되며 오류는 발생하지 않는다. 또한 CacheSize 속성에는 0을 설정할 수 없으며, 설정하려 한다면 오류가 발생한다.

로컬 메모리의 캐쉬에 존재하는 레코드들은 다른 사용자에 의해서 변경된 내역을 반영하지 못하며, 캐쉬 데이터를 최신의 데이터로 변경하기 위해서는 Recordset 개체의 Resync 메서드를 사용하면 된다.

[예제]

다음 예제는 Pubs 데이터베이스의 roysched 테이블의 레코드를 가져와서 CacheSize 속성의 값이 1(디폴트 값)일 경우와 30일 경우에 전체 레코드의 필드를 읽는 속도의 차이를 보여주는 예이다.

Public Sub cmdCacheSize_Click()
   Dim adoRs As New Recordset
   Dim strConn As String
   Dim sngStart As Single
   Dim sngEnd As Single
   Dim sngNoCache As Single
   Dim sngCache As Single
   Dim strTemp As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=Chris;Initial Catalog=pubs;User Id=sa;Password=; "

   adoRs.Open "roysched", strConn, , , adCmdTable

   sngStart = Timer

   adoRs.MoveFirst

   Do While Not adoRs.EOF
      strTemp = adoRs!Title_Id

      adoRs.MoveNext
   Loop

   sngEnd = Timer
   sngNoCache = sngEnd - sngStart

   adoRs.MoveFirst
   adoRs.CacheSize = 30
   sngStart = Timer

   adoRs.MoveFirst

   Do While Not adoRs.EOF
      strTemp = adoRs!Title_Id

      adoRs.MoveNext
   Loop

   sngEnd = Timer
   sngCache = sngEnd - sngStart

   MsgBox "
성능 결과: " & vbCr & _
         " CacheSize
디폴트 1 (No cache): " & _
         Format(sngNoCache, "##0.000") & "
" & vbCr & _
         " CacheSize 30 (30-record cache): " & _
         Format(sngCache, "##0.000") & "
"

   adoRs.Close

   Set adoRs = Nothing
End Sub

 

CursorLocation 속성

CursorLocation 속성은 커서 엔진의 위치를 지정하는 속성이며, 다음 상수 중에 하나를 지정할 수 있다.

상수

설명

AdUseNone

커서 서비스를 사용하지 않는다. (이 상수는 단지 하위 버전과의 호환성을 위해서 제공되는 것이다.)

AdUseClient

로컬 커서 라이브러리에 의해서 제공되는 클라이언트 사이드 커서를 사용한다. 로컬 커서 엔진은 종종 드라이버가 제공하는 서버 사이드 커서가 제공하지 못하는 기능들을 제공하기 위해서 사용된다. 또한 하위 버전과의 호환성 때문에 adUseClientBatch도 역시 지원한다.

adUseServer

디폴트, 데이터 Provider 또는 드라이버가 제공하는 커서로서, 매우 유연하고 다양한 기능들을 제공한다. 그렇지만, 마이크로소프트의 클라이언트 커서가 제공하는 몇몇 기능을 제공하지 못한다.

이 속성은 Provider가 제공하는 다양한 커서 라이브러리를 선택하도록 한다. 개발자는 상황에 따라 클라이언트 사이드 또는 서버 사이드 커서를 사용할 수 있다.

CursorLocation 속성은 Connection 개체와 Recordset 개체가 모두 가지고 있으며, 디폴트 값은 서버 사이드 커서(adUseServer)이다. Recordset 개체의 CursorLocation 속성은 상위의 Connection 개체로부터 값을 상속받으며, Recordset 개체를 생성할 때 추가로 다른 CursorLocation으로 지정을 하였다면 Connection 개체의 CursorLocation 속성과 다른 값을 갖게 된다.

이 속성은 읽기/쓰기가 가능하며, Recordset 개체의 경우에는 Recordset 개체가 열려진 후에는 변경할 수 없다.

Remote Data Service 환경에서 클라이언트 사이드 Recordset 개체(ADOR) 또는 Connection 개체를 사용하기 위해서는 CursorLocation 속성을 클라이언트 사이드(adUseClient)로 설정해야 한다.

RDO에서는 rdoConnection 개체를 생성할 때 CursorDriver라는 속성을 사용해서 커서의 위치를 결정하게 했다. 여기에서 커서는 데이터베이스에서 사용자가 원하는 레코드를 요청했을 때 메모리에 생성되는 레코드셋이라고 이해하면 된다. RDO에서는 서버 사이드, 클라이언트 사이드, ODBC 사이드 이렇게 세가지 타입의 커서 위치를 지원했으며, 클라이언트 사이드 커서는 반환되는 레코드의 개수가 적을 경우에 주로 사용되었으며, 서버 사이드 커서는 반환되는 레코드의 개수가 많을 경우에 주로 사용되었다. 하지만, rdoConnection에서만 지정할 수 있었기 때문에 rdoResultset을 생성할 때 유연하게 설정할 수 없는 이유로 대부분의 개발자들은 자동으로 커서의 위치가 설정되는 ODBC 사이드 커서를 사용해 왔다. 이런 제약들이 ADO에서는 Connection 개체와 Recordset 개체에 모두 CursorLocation 속성을 지원함으로 해결되었다.

[예제]

다음의 예제는 Pubs 데이터베이스의 Employee 테이블에 있는 레코드의 값을 보여주는 것이다. 예제에서 볼 수 있듯이 Recordset 개체의 RecordCount 속성과 AbsolutePosition 속성은 클라이언트 사이드 커서일 경우에만 값을 가지며 서버 사이드 커서일 경우에는 -1을 갖는다.

Private Sub cmdCursorLocation_Click()
   Dim adoRs As New Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=Chris;Initial Catalog=Pubs;User Id=sa;Password=; "

   adoRs.CursorLocation = adUseClient
   adoRs.Open "Employee", strConn, , , adCmdTable

   Do While Not adoRs.EOF
      Debug.Print "Employee: " & adoRs!lName & _
         " ( " & adoRs.AbsolutePosition; " / " & _
            adoRs.RecordCount & "
번째 레코드)"

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing
End Sub

위의 예제에서 볼 수 있듯이, RecordCount 속성과 AbsolutePosition 속성 같은 몇몇 속성들은 CursorLocation 속성과 CursorType 속성에 영향을 받는다. CursorLocation 속성과 CursorType의 관계는 다음과 같다.

CursorType/CursorLocation

Server Side

Client Side

adOpenForwardOnly

O

X

adOpenKeyset

O

X

adOpenDynamic

O

X

adOpenStatic

O

O

위의 표에서 볼수 있듯이, ADO에서 클라이언트 사이드의 CursorLocation 일 경우에는 Static 커서만 사용가능하다. 그리고 RDO에서 CursorDriver CursorType을 잘 못 지정하면 오류가 발생하지만, ADO에서는 잘 못 지정하더라도 Provider가 알아서 수정하기 때문에 개발자가 정확하게 알고 지정해야만 오류를 피할 수 있다.

예를 들어, 다음과 같은 코딩을 실행해 본다.

   Dim adoCn As New ADODB.Connection
   Dim adoRs As New ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "

   adoCn.CursorLocation = adUseClient
   adoCn.Open strConn

   adoRs.Open "Authors", adoCn, adOpenDynamic, adLockOptimistic

   Stop

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing

위의 코드에서 개발자는 커서 유형을 Dynamic(adOpenDynamic-2)으로 지정했다. 그러나 Recordset 개체가 열려진 후에 adoRs CursorType 속성을 조사해 보면, Static(adOpenStatic-3)임을 알 수 있을 것이다. 이렇기 때문에 CursorLocation CursorType에 대해서 개발자는 명확히 알고 있는 상태에서 개발을 해야한다.

CursorLocation에 따라 CursorType이 영향을 받는 것과 유사하게, RecordCount 또는 AbsolutePosition과 같은 속성도 CursorLocation CursorType에 따라 사용가능 여부가 결정된다. 다음 표는 이것들에 대한 관계이다.

CursorType/CursorLocation

Server Side

Client Side

adOpenForwardOnly

X

X

adOpenKeyset

O

X

adOpenDynamic

X

X

adOpenStatic

O

O

RecordCount AbsolutePosition과 같은 속성들은 CursorLocation이 서버 사이드일 경우에는 CursorType Static Keyset일 때만 사용이 가능하고, 그렇지 않을 경우에는 -1을 반환한다. CursorLocation이 클라이언트 사이드일 경우에는 CursorType Static일 때만 사용이 가능하다.

CursorType 속성

CursorType 속성은 Recordset 개체의 커서 유형을 지정한다. 커서 유형은 네 가지가 있으며, 다음과 같이 설정할 수 있다.

상수

설명

adOpenForwardOnly

디폴트, Forward-only 커서. Static 커서와 동일하며 단지 다음 레코드로만 이동할 수 있는 커서이다. 이 타입은 Recordset 개체가 생성될 때 다음 레코드에 대한 포인터만 가지도록 생성되므로 다른 유형의 커서 보다 생성되는 속도가 빠르다.

adOpenKeyset

Keyset 커서. Recordset 개체가 생성된 후에 다른 사용자에 의해서 추가되거나 삭제된 내용만 반영하지 못하며, 변경된 내용은 반영한다.

adOpenDynamic

Dynamic 커서. Recordset 개체가 생성된 후에 다른 사용자에 의해서 추가, 수정, 삭제된 내용을 반영하며, Recordset 개체를 통한 모든 이동 형식을 허용한다. , Provider Bookmark를 지원하지 못하는 경우에는 Bookmark를 지원하지 않는다.

adOpenStatic

Static 커서. 데이터베이스에 있는 레코드들의 정적인 복사본을 제공하는 커서이다. 즉 레코드를 가져오는 시점의 데이터를 가지고 있기 때문에 레코드를 가져온 후에 다른 사용자에 의해서 추가, 수정, 삭제된 내용이 반영되지 않는다.

이 속성은 Recordset이 생성되기 전에는 읽기/쓰기가 모두 가능하며, Recordset 이 생성된 후에는 읽기 전용이다.

만약 개발자가 지정한 커서 유형을 Provider가 지원하지 못할 경우에는 적절한 커서 유형으로 변경해서 지정하게 되며, 오류는 발생하지 않는다. 그렇기 때문에 개발자는 자신이 지정한 커서 유형으로 커서가 생성되었는지를 확인하는 습관을 가지는 것이 좋다. 이렇듯 Provider가 커서 유형을 지원하는 지를 확인하기 위해서 Supports 메서드를 사용할 수 있다.

커서 타입

아래의 상수에 대해서 True를 반환하면 지원하는 것이다.

adOpenForwardOnly

없음

adOpenKeyset

adBookmark, adHoldRecords, adMovePrevious, adResync

adOpenDynamic

AdMovePrevious

adOpenStatic

adBookmark, adHoldRecords, adMovePrevious, adResync

Remote Data Service 환경에서 클라이언트 사이드 Recordset 개체(ADOR)를 사용하기 위해서는 CursorType 속성을 반드시 adOpenStatic으로 설정해야 한다.

[예제]

다음 예제는 Authors 테이블을 Static 커서 유형으로 생성한 예이다.

Private Sub cmdCursorType_Click()
   Dim adoRs As New Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=Chris;Initial Catalog=Pubs;User Id=sa;Password=; "

   adoRs.CursorLocation = adUseClient
   adoRs.Open "Select * from Authors", strConn, adOpenStatic, adLockOptimistic

   While Not adoRs.EOF
      Debug.Print adoRs(0)

      adoRs.MoveNext
   Wend

   adoRs.Close
   Set adoRs = Nothing
End Sub

DataMember 속성

DataMember 속성은 DataSource 속성이 참조하는 개체에서 검색할 데이터 구성원의 이름을 나타낸다. 이 속성은 String 값을 설정하거나 반환한다.

이 속성은 비주얼베이직에서 Data Environment를 사용할 때 데이터 바운드 컨트롤을 생성하기 위해서 사용하며, Data Environment Recordset 개체로 표현되는 명명된 개체(데이터 구성원)를 포함하는 데이터 컬렉션(데이터 원본)을 유지 관리한다.

DataMember 속성과 DataSource 속성은 함께 사용되어야 한다.
DataMember
속성은 Recordset 개체로 표현되고 DataSource 속성에 의해 지정되는 개체를 결정한다. 이 속성을 설정하기 전에 먼저 Recordset 개체를 닫아야 한다. DataSource 속성을 설정하기 전에 DataMember 속성을 설정하지 않거나 또는 DataSource 속성으로 지정된 개체가 DataMember 이름을 인식하지 못하면 오류가 발생한다.

사용 예는 DataSource 속성를 참조한다.

DataSource 속성

DataSource 속성은 Recordset 개체로 나타낼 데이터를 포함하는 개체를 지정한다.

이 속성은 DataMember가 속한 Data Environment 내에 있는 개체를 저정한다.

참조된 개체는 IDataSource 인터페이스를 구현해야 하며 IRowset 인터페이스를 포함해야 한다.

[예제]

비주얼베이직 프로젝트에 Data Environment를 추가하고, Command를 추가한다.

   Dim adoRs As New Recordset

   adoRs.DataMember = "Command1" '
바인딩할 열 집합의 이름

   Set adoRs.DataSource = DataEnvironment1 'IRowset
을 포함하는 개체 이름

위의 예제에서 Command1 DataEnvironment1의 명령이다.

EditMode 속성

EditMode 속성은 현재 레코드의 편집 상태를 나타낸다. 이 속성은 아래의 상수 값(EditModeEnum)들 중에서 하나의 값을 가진다.

상수

설명

AdEditNone

편집 작업이 진행되지 않고 있음을 나타낸다.

AdEditInProgress

현재 레코드가 편집 중이며, 아직 저장되지 않았음을 나타낸다.

AdEditAdd

Recordset 개체의 AddNew 메서드를 사용해서 새로운 레코드를 편집하고 있음을 나타내며, 아직 저장되지 않은 상태이다.

AdEditDelete

현재 레코드가 삭제 되었음을 나타낸다.

ADO는 현재 레코드와 관련 있는 편집 버퍼를 유지보수하며, 이 버퍼의 내용이 변경되었거나, 새로이 추가된 경우를 나타낸다.

[예제]

다음 예제는 EditMode를 보여주는 예이다.

Private Sub cmdEditMode_Click()
   Dim adoCn As New Connection
   Dim adoRs As New Recordset

   adoCn.Open "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;" & _
         "User Id=sa;Password=; "

   Set adoRs.ActiveConnection = adoCn
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Employee", , , , adCmdTable

   adoRs!fname = "test"
   'Edit
후의 EditMode, adEditInProgress(1)
   Debug.Print adoRs.EditMode
   adoRs.CancelUpdate

   adoRs.AddNew
   adoRs!emp_id = "T-T55555M"
   adoRs!fname = "temp_fname"
   adoRs!lname = "temp_lname"
   'AddNew
후의 EditMode, adEditAdd(2)
   Debug.Print adoRs.EditMode

   adoRs.UpdateBatch
   'UpdateBatch
후의 EditMode, adEditNone(0)
   Debug.Print adoRs.EditMode

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Execute "DELETE FROM Employee WHERE emp_id = 'T-T55555M'"
   adoCn.Close

   Set adoCn = Nothing
End Sub

Filter 속성

Filter 속성은 Recordset 개체 내의 데이터에 대한 필터를 나타낸다. 이 속성은 다음 표중 하나를 포함할 수 있는 Variant 값을 설정하거나 반환한다.

수식문자열

And 또는 Or 연산자를 사용해서 작성할 수 있다. 예를 들어 "LasrName = 'Choi'"(FieldName-Opertor-Value)와 같이 작성하면 된다.
- FieldName
Recordset 개체 내에 존재하는 필드명을 사용해야 하며, 만약 필드 명에 스페이스가 포함되어져 있다면 중괄호([ ])로 묶어야 한다.
-
사용할 수 있는 Operator <,>, <=,>=, <>, =, or LIKE 이다.

- And
Or 연산자 사이에 우선 순위는 없으며, 괄호를 사용해서 그룹으로 묶어서 사용할 수 있다. 하지만, Or에 의해 생성한 그룹을 다른 그룹과 And로 묶을 수는 없다. 다음과 같은 경우는 사용할 수 없다. (LastName = 'Smith' OR LastName = 'Jones') AND FirstName = 'John'
-
대신 아래와 같이 사용할 수 있다. (LastName = 'Smith' AND FirstName = 'John') OR (LastName = 'Jones' AND FirstName = 'John')Like 문을 사용하는 예는 일반적인 경우와 동일하며, WildCard 문자(*)를 사용할 수 있다.

Bookmark들의 배열

Recordset 개체 내의 레코드들을 가리키는 유일한 Bookmark들의 배열

FilterGroupEnum 값들 중 하나

다음 표를 참조한다.

FilterGroupEnum 값은 다음 표와 같다.

상수

설명

adFilterNone

현재의 Filter를 제거하고, Recordset 개체를 원상태로 복구한다.

adFilterPendingRecords

변경은 되었지만, 아직 서버에 전송되지 않은 레코드들만 보여지도록 한다. 단지 BatchUpdate 모드에서만 사용할 수 있다.

adFilterAffectedRecords

Delete, Resync, UpdateBatch, 또는 CancelBatch 메서드의 호출 후에 영향을 받은 레코드들만 보여지도록 한다.

adFilterFetchedRecords

현재 캐쉬 내에 있는 레코드들만 보여지도록 한다. , 데이터베이스로부터 생성한 마지막 Recordset만 보여지도록 한다.

adFilterConflictingRecords

가장 최근에 BatchUpdate 처리를 실패한 레코드들만 보여지도록 한다.

Filter 속성은 Recordset 개체 내의 데이터를 필터링해서 원하는 레코드들만을 보여지도록 설정한다. Filter를 설정할 경우 레코드의 위치는 필터에 의해서 생성된 Recordset 개체의 부분 집합인 레코드들의 처음으로 이동하게 된다. 필터를 해제할 경우에는 Filert 프로퍼티에 길이가 0인 문자열("")을 지정하거나, adFilterNone상수를 지정하면 된다. 이렇게 필터를 해제했을 경우에도 Recordset 개체의 위치는 처음으로 이동하게 된다.

Filter 속성과 함께 사용할 수 있는 Bookmark들의 배열을 만들 수 있으며, Bookmark에 대한 설명은 Recordset 개체의 Bookmark 속성을 참조한다.

[예제]

생성한 Recordset 개체와 바인딩하기 위해서 비주얼 베이직의 프로젝트 메뉴의 구성요소(Components)... 메뉴에서 Microsoft DataGrid Control 6.0(OLEDB)을 선택한다.

다음 예제는 Pubs 데이터베이스의 Authors 테이블의 레코드를 DataGrid1에 바인딩하여 Filter 속성을 사용해서 레코드를 필터링하는 예제이다.

Dim adoCn As New Connection
Dim adoRs As New Recordset

Private Sub cmdOpenRecordset_Click()

   adoCn.Open "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;" & _
         "User Id=sa;Password=; "

   adoRs.Open "Select * from Authors", adoCn, adOpenStatic, adLockOptimistic

   Set DataGrid1.DataSource = adoRs

   Debug.Print adoRs.RecordCount
End Sub

Private Sub cmdFilter_Click()
   adoRs.Filter = "State='CA'"

   Debug.Print adoRs.RecordCount
End Sub

Private Sub cmdReleaseFilter_Click()
   adoRs.Filter = adFilterNone

   Set DataGrid1.DataSource = adoRs
End Sub

위의 예제에서 Filter를 해제하더라도 바인딩한 컨트롤에 반영이 되지 않을 경우에는 Set DataGrid1.DataSource = adoRs 문장을 사용해서 다시 초기화해 주어야 한다.

그리고 Filter 속성을 사용해서 Recordset 개체 내의 레코드들에 대해서 필터링을 했을 경우에 Recordset 개체의 RecordCount 속성은 필터링된 레코드들에 대한 개수를 나타낸다.

 

LockType 속성

LockType 속성은 Recordset 개체 내의 레코드를 편집할 동안 해당 레코드에 설정할 Lock 유형을 나타낸다.

LockType 속성에는 아래의 LockTypeEnum 값들 중 하나를 지정할 수 있다.

상수

설명

adLockReadOnly

기본값. 읽기 전용-데이터를 변경할 수 없다.

adLockPessimistic

독점 잠금, 레코드별-제공자는 레코드가 성공적으로 편집되도록 하기 위해 대개 편집을 시작하면 그 즉시 데이터 원본의 레코드를 잠근다

adLockOptimistic

공유 잠금, 레코드별-제공자는 Update 메서드를 호출할 경우에만 레코드를 잠그는 공유 잠금을 사용한다.

adLockBatchOptimistic

공유 일괄 업데이트-즉시 업데이트 모드와 대조되는 일괄 업데이트 모드에 필요하다

Recordset을 열기 전에 LockType 속성을 설정하여 Recordset을 열 때 사용할 Lock 형식을 지정한다. LockType 속성은 Recordset이 닫혀 있을 때는 읽기/쓰기가 가능하며 열려 있을 때는 읽기 전용이다.

Provider가 모든 Lock 형식을 지원하지는 않는다. Provider가 요청된 LockType 설정을 지원하지 못할 경우에는 오류가 발생하지는 않고 다른 형식의 LockType을 대신 사용한다.

Client Side 커서일 경우에는 Pessimistic Locking을 사용할 수 없다.

클라이언트 (ADOR) Recordset 개체에서 사용될 경우 LockType 속성은 adLockOptimisticBatch로만 설정될 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블을 adLockOptimistic로 생성하는 예이다.

Private Sub cmdLockType_Click()
   Dim adoCn As New Connection
   Dim adoRs As New Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"

   adoCn.Open strConn

   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", adoCn

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

MarchalOptions 속성

MarchalOptions 속성은 서버로 다시 마샬링될 레코드를 나타낸다. 이 속성은 다음 상수 중 하나의 Long 값을 설정하거나 반환한다.

상수

설명

adMarshalAll

기본값, 모든 행이 서버에 반환됨을 나타낸다.

adMarshalModifiedOnly

수정된 행만 서버에 반환됨을 나타낸다.

클라이언트(ADOR) Recordset을 사용할 때 클라이언트에서 수정된 레코드는 마샬링(Marchaling)이라는 기법을 통해 중간 계층이나 웹 서버로 다시 보내진다. 마샬링은 스레드나 프로세스 경계를 통과하도록 인터페이스 메서드 매개 변수를 패키징하여 보내는 프로세스이다. MarshalOptions 속성을 설정하면 수정된 원격 데이터를 업데이트하기 위해 중간 계층이나 웹 서버로 다시 마샬링할 때 성능을 향상시킬 수 있다.

[예제]

다음 예제는 사용자의 입력을 받아서 MarshalOptions 속성을 지정하여 데이터를 처리하는 예이다.

Private Sub cmdMarshalOptions_Click()
   Dim adoRs As New Recordset
   Dim strConn As String
   Dim strOldFirst As String
   Dim strOldLast As String
   Dim strMessage As String
   Dim strMarshalAll As String
   Dim strMarshalModified As String

   ' Employee
테이블에서 이름이 있는 레코드 집합을 엽니다.
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   adoRs.CursorLocation = adUseClient
   adoRs.Open "SELECT fname, lname " & _
      "FROM Employee ORDER BY lname", strConn, adOpenKeyset, adLockOptimistic

   '
원래 데이터를 저장합니다.
   strOldFirst = adoRs!fname
   strOldLast = adoRs!lname

   '
편집 버퍼의 데이터를 변경합니다.
   adoRs!fname = "Linda"
   adoRs!lname = "Kobara"

   '
버퍼 내용을 보여주고 사용자 입력을 얻습니다.
   strMessage = "Edit in progress:" & vbCr & "
원본 데이터 = " & strOldFirst & " " & _
         strOldLast & vbCr & "
버퍼 내에 있는 데이터 = " & adoRs!fname & " " & _
         adoRs!lname & vbCr & vbCr & _
      "Recordset
내에 있는 원본 데이터를 버퍼 내에 있는 데이터로 교체하시겠습니까?"

   strMarshalAll = "
모든 레코드를 서버에 보내시겠습니까?"
   strMarshalModified = "
변경된 레코드만 서버에 보내시겠습니까?"

   If MsgBox(strMessage, vbYesNo) = vbYes Then
      If MsgBox(strMarshalAll, vbYesNo) = vbYes Then
         adoRs.MarshalOptions = adMarshalAll
         adoRs.Update
      ElseIf MsgBox(strMarshalModified, vbYesNo) = vbYes Then
         adoRs.MarshalOptions = adMarshalModifiedOnly
         adoRs.Update
      End If
   End If

   '
결과 데이터를 보여줍니다.
   MsgBox "Recordset
내에 있는 데이터 = " & adoRs!fname & " " & adoRs!lname

   '
이 코드는 데모이므로 원래 데이터를 복원합니다.
   If Not (strOldFirst = adoRs!fname And strOldLast = adoRs!lname) Then
      adoRs!fname = strOldFirst
   adoRs!lname = strOldLast
      adoRs.Update
   End If

   adoRs.Close
   Set adoRs = Nothing
End Sub

MaxRecords 속성

MaxRecords 속성은 질의에서 Recordset 개체에 반환되는 최대 레코드 개수를 나타내며, Long 값을 설정하거나 반환한다. 기본 값은 0이며 무제한이다.

이 속성을 사용하여 Provider가 데이터 원본에서 반환하는 레코드 개수를 제한할 수 있다. 이 속성의 기본 설정값은 0이며, 이것은 Provider가 요청된 모든 레코드를 반환한다는 의미이다.

이 속성은 Recordset 개체가 닫혀 있을 경우에는 읽기와 쓰기가 모두 가능하며, 열려 있을 경우에는 읽기 전용이다.

[예제]

다음 예제는 Pubs 데이터베이스의 Titles 테이블에서 가격이 제일 비싼 10개 레코드를 반환하는 예이다.

Private Sub cmdMaxRecords_Click()
   Dim adoRs As New Recordset
   Dim strConn As String

   ' Titles
테이블에서 가장 비싼 제목 10개를 포함하는
   '
레코드 집합을 엽니다.
   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   adoRs.MaxRecords = 10
   adoRs.Open "SELECT Title, Price FROM Titles " & _
      "ORDER BY Price DESC", strConn, , , adCmdText

   '
레코드 집합의 내용을 표시합니다.
   Debug.Print "
가장 비싼 상위 10개의 레코드:"

   Do While Not adoRs.EOF
      Debug.Print " " & adoRs!Title & " - " & adoRs!Price
      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing
End Sub

PageCount 속성

PageCount 속성은 Recordset 개체에 들어 있는 데이터의 페이지 수를 나타내며, Long 값을 반환한다.

이 속성을 사용하여 Recordset 개체에 있는 데이터의 페이지 수를 결정한다. 페이지는 PageSize 속성 설정값과 동일한 크기를 가진 레코드 그룹이며, 마지막 페이지가 PageSize 속성 값보다 적은 수의 레코드를 가지고 있더라도 PageCount 값에 추가 페이지로 계산된다.
Recordset
개체가 이 속성을 지원하지 않을 경우에는 -1 값을 반환한다.

[예제]

다음 예제는 Pubs 데이터베이스의 Employee 테이블의 레코드를 5개씩 PageSize 속성과 PageCount 속성을 사용해서 화면에 표시하는 예이다.

Private Sub cmdPageCount_Click()
   Dim adoRs As New Recordset
   Dim strConn As String
   Dim strMessage As String
   Dim intPage As Integer
   Dim intPageCount As Integer
   Dim intRecord As Integer

   '
클라이언트 커서를 사용하여 employee 테이블에 대한
   '
레코드 집합을 엽니다.
   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "
   '
클라이언트 커서를 사용하여 AbsolutePosition 속성을 사용할 수 있게 합니다.
   adoRs.CursorLocation = adUseClient
   adoRs.Open "employee", strConn, , , adCmdTable

   '
한번에 레코드 5개씩 이름과
   '
고용 날짜를 표시합니다.
   adoRs.PageSize = 5
   intPageCount = adoRs.PageCount

   For intPage = 1 To intPageCount
      adoRs.AbsolutePage = intPage
      strMessage = ""
      For intRecord = 1 To adoRs.PageSize
         strMessage = strMessage & adoRs!fname & " " & _
            adoRs!lname & " " & adoRs!hire_date & vbCr
         adoRs.MoveNext

         If adoRs.EOF Then Exit For
      Next intRecord
      MsgBox strMessage
   Next intPage

   adoRs.Close
   Set adoRs = Nothing
End Sub

PageSize 속성

PageSize 속성은 Recordset 개체에서 페이지 하나를 구성하는 레코드 수를 나타내며, Long 값을 설정하거나 반환한다. 기본 값은 10이다.

이 속성을 사용하여 데이터의 논리적 페이지 하나에 들어 있는 레코드 수를 결정할 수 있으며, 페이지 크기를 설정하면 AbsolutePage 속성을 사용하여 특정 페이지의 첫째 레코드로 이동할 수 있다. 이 기능은 사용자가 페이지를 넘기면서 한번에 일정한 개수의 레코드를 볼 수 있게 하는 웹 프로그램 시나리오에서 유용하게 사용할 수 있다.

이 속성은 언제든지 설정할 수 있으며, 그 값은 특정 페이지의 첫째 레코드 위치를 계산하는데 사용된다.

이 속성의 예제는 PageCount 속성의 예제를 참조한다.

Properties 속성

Properties 속성은 Properties 컬렉션을 나타내며, 이 컬렉션은 한 개체의 특정 인스턴스에 대한 모든 Property 개체들을 포함한다.

Property 개체는 특정 Provider 마다 고유한 ADO 개체의 특성과 일치한다.

Property 개체는 다음과 같은 네 가지 기본 속성을 가지고 있다.

상수

설명

Name

해당 속성을 식별하는 문자열이다.

Type

속성의 데이터 형식을 지정하는 정수값이다.

Value

속성 설정에 들어 있는 Variant 값이다.

Attributes

공급자 특유의 속성 특성을 나타내는 Long 값이다.

[예제]

다음 예제는 Pubs 데이터베이스의 Employee 테이블에 연결된 Recordset 개체의 Properties 속성을 보여주는 예이다.

Private Sub cmdProperties_Click()
   Dim adoRs As New Recordset
   Dim strConn As String
   Dim i As Integer

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   adoRs.CursorLocation = adUseClient
   adoRs.Open "employee", strConn, , , adCmdTable

   For i = 0 To adoRs.Properties.Count - 1
      Debug.Print adoRs.Properties(i).Name & " : " & _
         adoRs.Properties(i).Value
   Next i

   adoRs.Close
   Set adoRs = Nothing
End Sub

위의 예제에 대한 결과는 다음과 같으며, 이 결과는 Provider에 따라 다르게 나타날 수 있다.

   IAccessor : True
   IChapteredRowset : True
   IColumnsInfo : True
   IColumnsRowset : True
   IConnectionPointContainer : True
   IConvertType : True
   ILockBytes : False
   IRowset : True
   IDBAsynchStatus : False
   IParentRowset : True
   IRowsetChange : False
   IRowsetExactScroll : True
   IRowsetFind : True
   IRowsetIdentity : True
   IRowsetInfo : True
   IRowsetLocate : True
   IRowsetRefresh : True
   IRowsetResynch : False
   IRowsetScroll : True
   IRowsetUpdate : False
   IRowsetView : True
   IRowsetIndex : False
   ISequentialStream : True
   IStorage : False
   IStream : False
   ISupportErrorInfo : True
   Preserve on Abort : True
   Access Order : 2
   Append-Only Rowset : False
   Blocking Storage Objects : False
   Use Bookmarks : True
   Skip Deleted Bookmarks : True
   Bookmark Type : 1
   Cache Deferred Columns : False
   Fetch Backwards : True
   Hold Rows : True
   Scroll Backwards : True
   Change Inserted Rows : True
   Column Privileges : False
   Command Time Out : 0
   Preserve on Commit : True
   Defer Column : False
   Delay Storage Object Updates : True
   Private1 :
   Filter Operations : 27
   Find Operations : 27
   Hidden Columns : 0
   Immobile Rows : True
   Literal Bookmarks : True
   Literal Row Identity : True
   Maximum Open Rows : 0
   Maximum Pending Rows : 0
   Maximum Rows : 0
   Column Writable : False
   Memory Usage : 0
   Notification Granularity : 1
   Notification Phases : 31
   Column Set Notification : 3
   Row Delete Notification : 3
   Row First Change Notification : 3
   Row Insert Notification : 3
   Row Resynchronization Notification : 3
   Rowset Release Notification : 3
   Rowset Fetch Position Change Notification : 3
   Row Undo Change Notification : 3
   Row Undo Delete Notification : 3
   Row Undo Insert Notification : 3
   Row Update Notification : 3
   Bookmarks Ordered : True
   Others' Inserts Visible : False
   Others' Changes Visible : False
   Own Inserts Visible : True
   Own Changes Visible : True
   Quick Restart : True
   Reentrant Events : True
   Remove Deleted Rows : True
   Report Multiple Changes : False
   Return Pending Inserts : True
   Row Privileges : False
   Asynchronous Rowset Processing : 16
   Row Threading Model : 1
   Server Cursor : False
   Strong Row Identity : True
   Objects Transacted : False
   Unique Rows : False
   Updatability : 7
   Batch Size : 15
   Update Criteria : 2
   Background Fetch Size : 15
   Initial Fetch Size : 50
   Background thread Priority : 3
   Cache Child Rows : True
   Maintain Change Status : False
   Auto Recalc : 1
   Unique Table :
   Unique Schema :
   Unique Catalog :
   Resync Command :
   Cursor Engine Version : 25
   Reshape Name :
   Update Resync : 1
   Bookmarkable : True

RecordCount 속성

RecordCount 속성은 Recordset 개체의 현재 레코드 수를 나타내며, Long 값을 반환한다.

이 속성을 사용하면 Recordset 개체에 있는 레코드의 개수를 알 수 있으며, 이 속성을 지원하지 못할 경우에는 -1을 반환한다. 또한 닫힌 Recordset 개체에서 이 속성을 읽으면 오류가 발생한다.

이 속성은 CursorLocation 속성과 CursorType 속성에 따라 지원 여부가 결정되며, 다음과 같은 환경에서 사용여부가 결정된다.

CursorType/CursorLocation

Server Side

Client Side

adOpenForwardOnly

X

X

adOpenKeyset

O

X

adOpenDynamic

X

X

adOpenStatic

O

O

[예제]

다음 예제는 Pubs 데이터베이스의 Employees 테이블의 레코드 개수를 반환하는 예이다.

Private Sub cmdRecordCount_Click()
   Dim adoRs As New Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   adoRs.CursorLocation = adUseClient
   adoRs.Open "employee", strConn, , , adCmdTable

   Debug.Print "
레코드 개수 : " & adoRs.RecordCount

   adoRs.Close
   Set adoRs = Nothing
End Sub

 

Sort 속성

Sort 속성은 Recordset 개체를 정렬할 하나 이상의 필드 이름을 지정하고, 각 필드를 오름차순 또는 내림차순으로 정렬할지 여부를 지정한다.

이 속성은 정렬할 각 필드 이름을 쉼표로 구분해 놓은 String을 설정하거나 반환하며, 이 때 각 이름은 Recordset 개체의 Fields에 해당한다. 또한 옵션으로 필드 이름 뒷 부분을 공백으로 설정하거나, 필드 정렬 순서를 지정하는 ASC(Ascending) 또는 DESC(Descending) 키워드를 지정할 수 있다.

이 속성의 설정에 의해서 데이터가 실제로 재정렬되는 것이 아니라 단지 정렬된 순서로 접근되는 것이다. CusorLocation adUseClient로 설정한 경우, 인덱스가 아직 없으면 Sort 속성에 지정된 각 필드에 대해 임시 인덱스가 작성된다.

이 속성을 빈 문자열로 설정하면 행들이 원래 순서대로 재설정되고 임시 인덱스는 삭제된다. 하지만, 기존에 있던 인덱스들은 삭제되지 않는다.

이 속성은 CursorLocation이 클라이언트일 경우에만 지원된다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블의 레코드를 조회하고 정렬하는 예이다.

1. 새로운 프로젝트를 시작하고, 프로젝트 메뉴의 참조에서 ADO를 참조한다.

2. 새로운 폼을 하나 추가해서 다음과 같이 디자인한다.


[
그림] Sort 화면

개체

속성

Form

Name

frmSort

 

Caption

Sort

MSHFlexGrid

Name

Grid

CommandButton

Name

cmdOpen

 

Caption

Open

CommandButton

Name

cmdSort

 

Caption

Sort

CommandButton

Name

cmdRelease

 

Caption

Release

3. frmSort 폼의 코드 모듈에 다음과 같이 코딩한다.

Dim adoCn As New Connection
Dim adoRs As New Recordset

Private Sub cmdOpen_Click()
   adoCn.Open "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   adoRs.CursorLocation = adUseClient
   adoRs.Open "Select * from Authors", adoCn, adOpenStatic, adLockOptimistic

   Set Grid.DataSource = adoRs
End Sub

Private Sub cmdRelease_Click()
   adoRs.Sort = ""
End Sub

Private Sub cmdSort_Click()
   adoRs.Sort = "city ASC"
End Sub

5. 프로그램을 실행하면 다음과 같은 화면을 볼 수 있다.


[
그림] 레코드가 정렬된 화면

Source 속성

Source 속성은 Recordset 개체에 있는 데이터에 대한 원본(Command 개체, SQL , 데이블 이름 또는 저장 프로시저)을 나타낸다. 이 속성은 String 값이나 Command 개체 참조를 설정하며 String 값만 반환한다.

이 속성을 사용하여 Command 개체 변수, SQL , 저장 프로시저 또는 테이블 이름 중 하나로 Recordset 개체에 대한 데이터 원본을 지정한다. Recordset 개체가 닫혀 있을 경우에 Source 속성은 읽기와 쓰기가 모두 가능하며, 열려 있을 경우에는 읽기 전용이다.

Source 속성을 Command 개체로 설정하면 Recordset 개체의 ActiveConnection 속성은 지정된 Command 개체의 ActiveConnection 속성 값을 상속 받는다. 그러나 Source 속성을 읽으면 Command 개체를 반환하지 않고 대신에 Source 속성에 설정된 Command 개체의 CommandText 속성을 반환한다.

Source 속성이 SQL , 저장 프로시저 또는 테이블 이름일 경우에는 Open 메서드를 호출할 때 적절한 Options 인수를 전달하여 성능을 최적화할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Titles 테이블을 Command 개체와 SQL문을 사용해서 열고, Recordset 개체의 Source를 보여주는 예이다.

Private Sub cmdSource_Click()
   Dim adoCn As New Connection
   Dim adoCmd As New Command
   Dim adoRs1 As New Recordset
   Dim adoRs2 As New Recordset

   adoCn.Open "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoCmd.ActiveConnection = adoCn

   adoCmd.CommandText = "Select title, type, pubdate " & _
         "FROM titles ORDER BY title"
   Set adoRs1 = adoCmd.Execute()

   adoRs2.Open "publishers", adoCn, , , adCmdTable

   Debug.Print "adoRs1.Source : " & adoRs1.Source
   Debug.Print "adoRs2.Source : " & adoRs2.Source

   adoRs1.Close
   Set adoRs1 = Nothing

   adoRs2.Close
   Set adoRs2 = Nothing

   Set adoCmd = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

직접 실행창에 나타나는 결과는 다음과 같다.

adoRs1.Source : Select title, type, pubdate FROM titles ORDER BY title
adoRs2.Source : select * from publishers

위의 결과에서 알 수 있듯이, Command 개체일 경우에는 CommandText에 해당하는 String이 반환된다.

State 속성

State 속성은 사용할 수 있는 모든 개체에 대해 이들 개체의 상태가 열려 있는지 또는 닫혀 있는지 여부를 나타낸다. 이 속성은 비동기 메서드를 실행하는 Recordset 개체에 대해 개체의 현재 상태가 연결 중인지, 실행 중인지 또는 가져오는 중인지 여부를 나타낸다.

이 속성은 아래 상수들 중 하나가 될 수 있는 Long 값을 반환한다.

상수

설명

adStateClosed

기본값, 개체가 닫혀 있음을 나타낸다.

adStateOpen

개체가 열려 있음을 나타낸다.

adStateConnecting

Recordset 개체가 연결 중임을 나타낸다.

adStateExecuting

Recordset 개체가 명령을 실행하는 중임을 나타낸다.

adStateFetching

Recordset 개체의 행을 가져오는 중임을 나타낸다.

이 속성을 사용하면 주어진 개체의 현재 상태를 언제든지 결정할 수 있으며, 이 속성은 읽기 전용이다. 이 속성은 여러 가지 값이 조합된 값을 가질 수 있다. 예를 들어, 한 문장을 실행하고 있을 경우에는 adStateOpen adStateExecuting이 조합된 값을 갖는다.

[예제]

다음 예제는 Recordset State를 보여주는 예이다.

Private Sub cmdState_Click()
   Dim adoCn As New Connection
   Dim adoRs As New Recordset

   adoCn.Open "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   adoRs.Open "publishers", adoCn, , , adCmdTable

   Debug.Print "adoRs.State : " & adoRs.State

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

Status 속성

Statue 속성은 일괄 업데이트 또는 기타 대량 작업과 관련된 현재 레코드의 상태를 나타낸다. 이 속성은 다음과 같은 RecordStatusEnum 값들 중에서 하나 이상을 합한 값을 반환한다.

상수

설명

adRecOK

레코드가 성공적으로 업데이트 되었음을 나타낸다.

adRecNew

레코드가 새 레코드임을 나타낸다.

adRecModified

레코드가 수정되었음을 나타낸다.

adRecDeleted

레코드가 삭제되었음을 나타낸다.

adRecUnmodified

레코드가 수정되지 않았음을 나타낸다.

adRecInvalid

Bookmark가 유효하지 않기 때문에 레코드가 저장되지 않았음을 나타낸다.

adRecMultipleChanges

레코드가 다수의 레코드에 영향을 주기 때문에 저장되지 않았음을 나타낸다.

adRecPendingChanges

레코드가 보류(Pending) 중인 삽입 내용을 참조하기 때문에 저장되지 않았음을 나타낸다.

adRecCanceled

작업이 취소되었기 때문에 레코드가 저장되지 않았음을 나타낸다.

adRecCantRelease

기존의 레코드 Lock 때문에 새 레코드가 저장되지 않았음을 나타낸다.

adRecConcurrencyViolation

Optimistic Concurrency가 사용되고 있기 때문에 레코드가 저장되지 않았음을 나타낸다.

adRecIntegrityViolation

사용자가 무결성 제약 조건들을 위반하였기 때문에 레코드가 저장되지 않았음을 나타낸다.

adRecMaxChangesExceeded

보류(Pending) 중인 변경 내용이 너무 많아서 레코드가 저장되지 않았음을 나타낸다.

adRecObjectOpen

열린 저장 개체와의 충돌 때문에 레코드가 저장되지 않았음을 나타낸다.

adRecOutOfMemory

시스템의 메모리가 부족해서 레코드가 저장되지 않았음을 나타낸다.

adRecPermissionDenied

사용자 권한이 충분하지 않아서 레코드가 저장되지 않았음을 나타낸다.

adRecSchemaViolation

레코드가 기본 데이터베이스의 구조를 위반했기 때문에 저장되지 않았음을 나타낸다.

adRecDBDeleted

레코드가 데이터 원본에서 이미 삭제되었음을 나타낸다.

이 속성을 사용하면 일관 업데이트 동안 수정된 레코드에 대해 어떤 변경 내용들이 보류 중인지 알 수 있으며, Recordset 개체에서 Resync, UpdateBatch 또는 CancelBatch 메서드를 호출하거나 Filter 속성을 Bookmark 배열로 설정하는 등의 대규모 작업을 하는 동안 실패한 레코드의 상태를 볼 수 있다. 이 속성을 사용하면 주어진 레코드가 실패한 형태를 알 수 있으며, 그에 대한 해결 방법도 결정할 수 있다.

[예제]

다음 예제는 일괄 업데이트에 대한 예이다.

Private Sub cmdStatus_Click()
   Dim adoRs As New Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   '
일괄 업데이트를 수행할 레코드 집합을 생성한다.
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockBatchOptimistic
   adoRs.Open "titles", strConn, , , adCmdTable

   ' psychology
제목의 형식을 변경합니다
   Do Until adoRs.EOF
      If Trim(adoRs!Type) = "psychology" Then
         adoRs!Type = "self_help"
      End If
      adoRs.MoveNext
   Loop

   ' Title ID
와 상태를 표시한다.
   adoRs.MoveFirst
   Do Until adoRs.EOF
      If adoRs.Status = adRecModified Then
         Debug.Print adoRs!title_id & " - Modified"
      Else
         Debug.Print adoRs!title_id
      End If
      adoRs.MoveNext
   Loop

   '
이 코드는 데모이기 때문에 업데이트를 취소한다.
   adoRs.CancelBatch

   adoRs.Close
   Set adoRs = Nothing
End Sub

StayInSync 속성

StayInSync 속성은 계층적 Recordset 개체에서 상위 행 위치가 변경할 때 기본 하위 레코드에 대한 참조가 변경되는지 여부를 나타낸다.

이 속성은 Boolean 값을 설정하거나 반환하며, 기본값은 True 이다. 이 속성이 True로 설정되면 상위 Recordset 개체가 행 위치를 변경할 때 해당 장이 업데이트 된다. False 일 경우에는 상위 Recordset 개체가 행 위치를 변경하더라도 해당 장은 계속해서 이전 장의 데이터를 참조한다.

이 속성은 Microsoft Data Shaping Service for OLE DB가 지원하는 것과 같은 계층적 레코드 집합에 적용되며, 하위 Recordset 개체를 검색하기 전에 상위 Recordset 개체에 설정되어야 한다. 이 속성은 계층적 레코드 집합 탐색을 간소화한다.

 

3Field 개체

Field 개체는 Recordset 개체에 포함된 하나의 컬럼 또는 필드를 나타낸다. Recordset 개체를 생성하면, Field 개체들로 구성된 Fields 컬렉션이 생성된다. 현재 레코드에 대한 데이터를 설정하거나 반환하려면 Field 개체의 Value 속성을 사용한다.

Field 개체의 속성

속성

설명

데이터 형식

ActualSize

필드 값의 실제 길이를 나타낸다. (읽기 전용)

Long

Attributes

Field 개체의 여러 특성을 나타낸다.

Long

DataFormat

데이터가 표시될 형식을 나타낸다.

stdDataFormat

DefinedSize

Field 개체의 정의된 길이를 나타낸다.

Long

Name

Field 개체의 이름을 나타낸다.

String

NumericScale

Field 개체의 숫자 값에 대한 Scale을 나타낸다.

Byte

OriginalValue

레코드를 변경하기 전에 있던 Field 개체의 값을 나타낸다.

Variant

Precision

Field 개체의 숫자 값에 대한 정밀도(Precision)를 나타낸다.

Byte

Type

Field 개체의 작업 형식 또는 데이터 형식을 나타낸다.

DataTypeEnum

UnderlyingValue

데이터베이스에 존재하는 Field 개체의 현재 값을 나타낸다.

Variant

Value

Field 개체에 지정된 값을 나타낸다.

Variant

ActualSize 속성

ActualSize 속성은 필드 값의 실제 길이를 나타내며, Long 값을 반환한다. 일부 Provider BLOB(Binary Large Object) 데이터에 대한 필요 공간을 확보하기 위해서 이 속성을 사용할 수 있다. 그럴 경우에 기본값은 0 이다.

모든 필드에 대해 이 속성은 읽기 전용이며, ADO에서 Field 개체 값의 길이를 지정할 수 없는 경우 이 속성은 adUnKnown을 반환한다.

다음 예제에서 알 수 있듯이 ActualSize 속성과 DefinedSize 속성은 서로 다르다. 필드를 adVarChar 형식으로 최대 길이가 50으로 선언했을 경우, Field 개체의 DefinedSize 속성 값은 50을 반환하지만, Field 개체의 ActualSize 속성 값은 현재 레코드의 필드에 저장된 데이터의 길이를 반환한다.

[예제]

다음 예제는 Pubs 데이터베이스의 Stores 테이블에 대한 Recordset 개체를 생성하고 Field 개체의 DefinedSize 속성 값과 ActualSize 속성 값을 비교하는 예이다.

Private Sub cmdActualSize_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   Set adoRs = New ADODB.Recordset

   adoRs.Open "Stores", strConn, , , adCmdTable

   Do Until adoRs.EOF
      Debug.Print "Store name: " & adoRs!stor_name & _
         vbCr & "Defined size: " & adoRs!stor_name.DefinedSize & _
         " - " & "Actual size: " & adoRs!stor_name.ActualSize & vbCr

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing
End Sub

Attributes 속성

Attributes 속성은 Field 개체의 여러 특성을 나타내며, Long 값을 반환한다.

속성 값은 FieldAttributeEnum 값 중에서 하나 이상의 값들의 합이 될 수 있다.

FieldAttrinuteEnum 값은 다음과 같다.

메서드

설명

adFldMayDefer

필드의 데이터가 데이터의 나머지 부분과 함께 검색된 것이 아니라, 참조될 때에 검색됨을 나타낸다. 이 옵션은 Recordset 개체가 참조하지 않은 BLOB 데이터를 포함하고 있을 경우에 유용하다.

adFldUpdatable

필드가 변경이 가능함을 나타낸다.

adFldUnknownUpdatable

필드가 변경 가능한지를 Provider가 알지 못함을 나타낸다.

adFldFixed

필드가 고정 길이 데이터를 포함하고 있음을 나타낸다.

adFldIsNullable

필드에 데이터를 쓰기 할 때, Null 값을 사용할 수 있음을 나타낸다.

adFldMayBeNull

필드로부터 데이터를 읽을 때, 필드가 Null 값을 포함할 수 있음을 나타낸다.

adFldLong

필드가 BLOB 데이터를 포함하고 있으며, AppendChunk GetChunk 메서드를 사용할 수 있음을 나타낸다.

adFldRowID

필드가 변경할 수 없는 RowID를 포함하고 있음을 나타낸다. RowID는 레코드 번호 또는 유일한 식별자와 같이 행을 식별하는 것을 제외한 어떤 의미도 가지지 않는다.

adFldRowVersion

필드가 변경을 추적하기 위해 사용되는 시간 또는 날짜 기록을 포함하고 있음을 나타낸다.

adFldCacheDeferred

Provider가 필드 값을 처음 읽을 때 캐쉬에 기록하고, 계속되는 읽기 작업은 캐시로 수행로부터 수행됨을 나타낸다.

이 속성을 사용해서 Field 개체의 특성을 설정하거나 반환할 수 있으며, 다수의 특성을 설정할 때, 적절한 상수들을 조합하여 사용할 수 있다.

필드가 Null을 포함할 수 있는지를 확인하려면 다음과 같이 코드를 작성하면 된다.

   If (adoRs.Fields(0).Attribute And adFldMayBeNull) = asFldMayBeNull) Then
      MsgBox "Field may contain a null."
   End If

DataFormat 속성

DataFormat 속성은 데이터가 표시될 형식을 나타내며, 구문은 다음과 같다.

Field.DataFormat = formatobject

위의 구문에서 사용된 formatobject stdDataFormat 개체이다.

이 속성은 DataFormat 개체를 지원하는 비주얼 베이직 6.0 이상과 비주얼 J++ 6.0 이상의 버전에서만 사용이 가능하다.

DefinedSize 속성

DefinedSize 속성은 Field 개체의 정의된 길이를 나타내며, 정의된 Field 개체의 길이를 바이트 수로 나타내는 Long 값을 반환한다.

이 속성은 사용해서 Field 개체의 데이터 용량을 결정한다. Field 개체의 DefinedSize 속성과 ActualSize 속성은 서로 다르며, 예제는 ActualSize 속성의 예제를 참조한다.

이 속성은 읽기와 쓰기가 모두 가능하지만, Recordset 개체가 열려진 후에는 읽기 전용이다.

Name 속성

Name 속성은 Field 개체의 이름을 나타내며, String 값을 반환한다.

Field 개체의 Name 속성은 읽기 전용이다, 그러나 Command 개체나 Parameter 개체의 Name 속성은 읽기와 쓰기가 모두 가능하다.

NumericScale 속성

NumericScale 속성은 Field 개체의 숫자 값에 대한 Scale을 나타내며, Byte 값을 반환한다.

SQL 서버의 Numeric 데이터 형식에서 Precision은 전체 숫자의 자릿수를 나타내며, Scale은 소수점 이하의 자릿수를 나타낸다.

예를 들어, Precision 4이고 Scale 2라면, 전체 숫자의 자릿수는 4이며, 그 중에서 소수점 이하는 2자리임을 나타내는 것이다. , 소수점 이상의 수에 대한 자릿수는 1이다.

이 속성을 사용하여 숫자로 된 Field 개체의 값을 나타낼 때 소수점 이하의 자릿수를 결정할 수 있다.

Field 개체의 NumericScale 속성은 읽기 전용이며, Parameter 개체의 이 속성은 읽기와 쓰기가 모두 가능하다.

[예제]

다음 예제는 Pubs 데이터베이스의 Discounts 테이블을 Recordset 개체로 생성하고, Field 개체의 Precision 속성 값과 NumericScale 속성 값을 보여주는 예이다.

Private Sub cmdNemericScale_Click()
   Dim adoRs As ADODB.Recordset
   Dim adoField As ADODB.Field
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.Open "Discounts", strConn, , , adCmdTable

   For Each adoField In adoRs.Fields
      If adoField.Type = adNumeric Then
         MsgBox "Field: " & adoField.Name & vbCr & _
            "Numeric Precision : " & adoField.Precision & vbCr & _
            "Scale : " & adoField.NumericScale
      End If
   Next adoField

   Set adoField = Nothing

   adoRs.Close
   Set adoRs = Nothing
End Sub

 

 

OriginalValue 속성

OriginalValue 속성은 레코드를 변경하기 전에 있던 Field 개체의 값을 나타내며, Variant 값을 반환한다.

배치 업데이트 모드가 아닌 경우, 이 속성은 변경하기 이전에 존재했던 필드 값을 가지고 있다. , 마지막으로 Update 메서드를 호출할 때 존재했던 값을 가지고 있다. 이 값은 CancelUpdate 메서드가 Value 속성을 이전으로 변경할 때 사용하는 값과 동일하다.

배치 업데이트 모드인 경우, 이 속성은 마지막으로 UpdateBatch 메서드를 호출할 때 존재했던 값을 가지고 있다. 이 값은 CancelBatch 메서드가 Value 속성을 변경할 때 사용하는 값과 동일하다. 이 속성은 UnderlyingValue 속성과 함께 배치 업데이트 모드에서 발생하는 충돌 문제를 해결할 때 사용된다.

[예제]

다음 예제는 Pubs 데이터베이스의 Titles 테이블을 Recordset 개체로 생성하고, Type 필드의 값을 "OriginalV"로 변경한다. 그러면 Type 필드의 OriginalValue 속성은 "OriginalV"가 된다. 그런 다음 adoCn Execute 메서드를 사용해서 Type 필드의 값을 "UnderlyingV"로 변경한다. 그러면 Type 필드의 UnderlyingValue 속성은 "UnderlyingV"가 된다. 그리고 난 다음 Type 필드의 값을 "NewV"로 변경하고, 각 속성의 값을 보여주는 예이다.

Private Sub cmdOriginalValue_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   Set adoRs.ActiveConnection = adoCn

   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Titles"

   adoRs.Fields(2) = "OriginalV"
   adoRs.Update

   adoCn.Execute "UPDATE titles SET type = 'UnderlyingV' " & _
         "WHERE type = 'OriginalV'"

   adoRs.MoveFirst
   adoRs.Fields(2).Value = "NewV"

   Debug.Print "Value : " & adoRs.Fields(2).Value & vbCrLf & _
         "OriginalValue : " & adoRs.Fields(2).OriginalValue & vbCrLf & _
         "UnderlyingValue : " & adoRs.Fields(2).UnderlyingValue

   adoRs.CancelUpdate

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

Precision 속성

Precision 속성은 Field 개체의 숫자 값에 대한 정밀도(Precision)를 나타내며, Byte 값을 반환한다.

SQL 서버의 Numeric 데이터 형식에서 Precision은 전체 숫자의 자릿수를 나타내며, Scale은 소수점 이하의 자릿수를 나타낸다.

예를 들어, Precision 4이고 Scale 2라면, 전체 숫자의 자릿수는 4이며, 그 중에서 소수점 이하는 2자리임을 나타내는 것이다. , 소수점 이상의 수에 대한 자릿수는 1이다.

이 속성을 사용하여 숫자로 된 Field 개체의 값을 나타낼 때 숫자 값 전체의 자릿수를 결정할 수 있다.

Field 개체의 이 속성은 읽기 전용이며, Parameter 개체의 Precision 속성은 읽기와 쓰기가 모두 가능하다.

이 속성에 대한 예제는 Field 개체의 NumericScale 속성의 예제를 참조한다.

Type 속성

Type 속성은 Field 개체의 작업 형식 또는 데이터 형식을 나타내며, DataTypeEnum 값 중 하나를 반환한다.

DataTypeEnum 값은 다음과 같다.

상수

설명

adBigInt

20

8 바이트의 부호 있는 정수(DBTYPE_I8)를 나타낸다.

adBinary

128

이진 값(DBTYPE_BYTES)을 나타낸다.

adBoolean

11

Boolean (DBTYPE_BOOL)을 나타낸다.

adBSTR

8

Null 종결 문자열(유니코드)(DBTYPE_BSTR)을 나타낸다.

adChapter

136

Child RowSet에서 Row를 식별하기 위해서 사용되는 4 바이트 Chapter (DBTYPE_HCHAPTER)을 나타낸다.

adChar

129

String (DBTYPE_STR)을 나타낸다.

adCurrency

6

Currency (DBTYPE_CY)을 나타낸다. Currency는 소수점 이하의 자릿수가 4개인 고정 자릿수이다. 이 값은 10,000으로 환산된 8바이트의 부호 있는 정수로 저장된다.

adDate

7

Date (DBTYPE_DATE)을 나타낸다. 날짜는 Double 형식으로 저장되며, 정수 부분은 1899 12 30일 이후의 날짜수이며 소수 부분은 하루 중 시간을 나타낸다.

adDBDate

133

날짜 값(yyyymmdd)(DBTYPE_DBDATE)을 나타낸다.

adDBFileTime

137

파일-시간 값(DBTYPE_DBFILETIME)을 나타낸다.

adDBTime

134

시간 값(hhmmss)(DBTYPE_DBTIME)을 나타낸다.

adDBTimeStamp

135

날짜-시간 스탬프(yyyymmddhhmmss 10억분의 1초 단위가 추가된)(DBTYPE_DBTIMESTAMP)를 나타낸다.

adDecimal

14

고정 정밀도와 크기로 나타낸 정확한 숫자 값(DBTYPE_DECIMAL)을 나타낸다.

adDouble

5

배정도의 부동 소수점 값(DBTYPE_R8)을 나타낸다.

adEmpty

0

지정된 값 없음(DBTYPE_EMPTY)을 나타낸다.

adError

10

32 비트 오류 코드(DBTYPE_ERROR)를 나타낸다.

adFileTime

64

1601 1 1일 이후의 1000만분의 1초 간격의 숫자를 표현하는 64 비트 값(DBTYPE_FILETIME)을 나타낸다.

adGUID

72

전역 고유 식별자(GUID)(DBTYPE_GUID)를 나타낸다.

adIDispatch

9

OLE 개체에서 IDispatch 인터페이스에 대한 포인터(DBTYPE_IDISPATCH)를 나타낸다.
참고 이 데이터 형식은 ADO에 의해서 현재는 지원되지 않는다. 이 데이터 형식의 사용은 예기치 않은 결과를 초래할 수 있다.

adInteger

3

4바이트의 부호 있는 정수(DBTYPE_I4)를 나타낸다.

adIUnknown

13

OLE 개체에서 IUnknown 인터페이스에 대한 포인터(DBTYPE_IUNKNOWN)를 나타낸다.
참고 이 데이터 형식은 ADO에 의해서 현재는 지원되지 않는다. 이 데이터 형식의 사용은 예기치 않은 결과를 초래할 수 있다.

adLongVarBinary

205

Long 이진 값(Parameter 개체만 해당)을 나타낸다.

adLongVarChar

201

Long String (Parameter 개체만 해당)을 나타낸다.

adLongVarWChar

203

Long Null 종결 문자열 값(Parameter 개체만 해당)을 나타낸다.

adNumeric

131

고정 정밀도와 크기로 나타낸 정확한 숫자 값(DBTYPE_NUMERIC)을 나타낸다.

adPropVariant

138

자동화 PROPVARIANT(DBTYPE_PROP_VARIANT)를 나타낸다.

adSingle

4

단정도의 부동 소수점 값(DBTYPE_R4)을 나타낸다.

adSmallInt

2

2 바이트의 부호 있는 정수(DBTYPE_I2)를 나타낸다.

adTinyInt

16

1 바이트의 부호 있는 정수(DBTYPE_I1)를 나타낸다.

adUnsignedBigInt

21

8 바이트의 부호 없는 정수(DBTYPE_UI8)를 나타낸다.

adUnsignedInt

19

4 바이트의 부호 없는 정수(DBTYPE_UI4)를 나타낸다.

adUnsignedSmallInt

18

2 바이트의 부호 없는 정수(DBTYPE_UI2)를 나타낸다.

adUnsignedTinyInt

17

1 바이트의 부호 없는 정수(DBTYPE_UI1)를 나타낸다.

adUserDefined

132

사용자 정의 변수(DBTYPE_UDT)를 나타낸다.

adVarBinary

204

이진 값(Parameter 개체만 해당)을 나타낸다.

adVarChar

200

String (Parameter 개체만 해당)을 나타낸다.

adVariant

12

자동화 Variant(DBTYPE_VARIANT)를 나타낸다.

adVarNumeric

139

숫자 값(Parameter 개체만 해당)을 나타낸다.

adVarWChar

202

Null 종결 유니코드 문자열(Parameter 개체만 해당)을 나타낸다.

adWChar

130

Null 종결 유니코드 문자열(DBTYPE_WSTR)을 나타낸다.

Field 개체의 이 속성은 읽기 전용이며, Parameter 개체의 Type 속성은 읽기와 쓰기가 모두 가능하다.

이 속성에 대한 예제는 Field 개체의 NumericScale 속성의 예제를 참조한다.

UnderlyingValue 속성

UnderlyingValue 속성은 데이터베이스에 존재하는 Field 개체의 현재 값을 나타내며, Variant 값을 반환한다.

이 속성은 Resync 메서드를 사용하는 것과 비슷하지만, Resync 메서드는 모든 필드의 값을 데이터베이스로부터 다시 갱신하지만, 이 속성을 사용하면 현재 데이터베이스에 저장되어 있는 특정 필드에 대한 값만을 알 수 있다.

이 속성은 OriginalValue 속성과 함께 배치 업데이트 모드에서 발생하는 충돌 문제를 해결하기 위해서 사용된다.

이 속성에 대한 예제는 Field 개체의 OriginalValue 속성의 예제를 참조한다.

Value 속성

Value 속성은 Field 개체에 지정된 값을 나타내며, Variant 값을 반환한다.

이 속성의 기본 값은 Field 개체의 Type 속성에 따라 달라진다.
이 속성은 Field 개체의 현재 값을 나타내며, 현재 데이터베이스에 저장되어져 있는 값을 나타내지는 않는다.

이 속성은 Field 개체의 디폴트 속성이며, 코드에서 생략할 수 있다. 다음 두줄의 코드는 동일한 것이다.

   adoRs("FirstName").Value = "Chris"
   adoRs("FirstName") = "Chris"

Field 개체의 세 가지 Value 속성들 사이의 차이점은 다음과 같다.

속성

설명

Value

Recordset 개체에 포함된 Field 개체의 현재 값을 나타내며, Field 개체의 값을 변경하면, 이 속성에 반영된다.

OriginalValue

Recordset 개체를 생성한 후에 변경 작업을 수행하기 이전의 Field 개체의 값을 나타낸다.

UnderlyingValue

데이터베이스에 저장되어 있는 Field 개체의 값을 나타낸다. 이 값은 다른 사용자에 의해서 변경된 데이터베이스의 내용도 반영한다.

 

메서드

설명

AddNew

Recordset 개체에 새로운 레코드를 추가한다.

Cancel

비동기적으로 실행한 Recordset 개체의 Open 메서드의 실행을 취소한다.

CancelBatch

보류 중인 일괄 업데이트 작업을 취소한다.

CancelUpdate

현재 레코드의 변경 내용 또는 새로 추가되는 레코드의 입력 내용에 대한 작업을 취소한다.

Clone

기존의 Recordset 개체로부터 복제(Clone) 개체를 생성한다. 옵션으로 이 복제 개체를 읽기 전용으로 지정할 수도 있다.

Close

열려 있는 Recordset 개체를 닫는다.

CompareBookmarks

두 개의 Bookmark를 비교해서 상대 값들과의 관계를 반환한다.

Delete

현재 레코드 또는 레코드 그룹을 삭제한다.

Find

정의된 기준에 맞는 레코드를 Recordset 개체에서 검색한다.

GetRows

Recordset 개체의 전체 레코드들을 배열로 가져온다.

GetString

Recordset 개체를 문자열로 반환한다.

Move

Recordset 개체의 현재 레코드 위치를 이동시킨다.

MoveFirst,MoveLast,
MoveNext,
MovePrevious

Recordset 개체에서 첫째 레코드, 마지막 레코드, 다음 레코드, 이전 레코드로 이동한 뒤에 해당 레코드를 현재 레코드로 지정한다.

NextRecordset

다중 Recordset 개체에서 다음 Recordset 개체를 반환하는 메서드이다.

Open

커서를 연다. Recordset 개체를 연다.

Requery

Recordset 개체를 생성한 질의를 다시 실행하여 Recodrset 개체에 있는 데이터를 갱신한다.

Resync

기본 데이터베이스로부터 현재 Recordset 개체의 데이터를 갱신한다.

Save

파일로 Recordset 개체를 저장한다.

Seek

Recordset 개체의 인덱스를 검색하여 지정한 값과 일치하는 행을 찾고 현재 행의 위치를 해당 행으로 변경한다.

Supports

Recordset 개체가 특정 기능을 지원하는 지의 여부를 결정한다.

Update

Recordset 개체의 현재 레코드에 대한 변경 내용을 저장한다.

UpdateBatch

보류 중인 모든 일괄 업데이트 내용을 디스크에 기록한다.

AddNew 메서드

AddNew 메서드는 Recordset 개체에 새로운 레코드를 추가하는 메서드이며, 구문은 다음과 같다.

   Recordset.AddNew FieldList, Values

매개변수에 대한 설명은 다음과 같다.

매개변수

설명

FieldList

선택 사항이며, 새 레코드의 필드에 대한 유일한 이름 또는 이름의 배열 또는 순서상의 위치를 지정하는 매개변수이다.

Values

선택 사항이며, 새 레코드의 필드에 대한 유일한 값 또는 값들의 배열을 지정하는 매개 변수이다. Fields 가 배열인 경우에 Values는 동일한 개수의 구성원을 갖고 있는 배열이어야 하며, 그렇지 않으면 오류가 발생한다. 필드 이름의 순서는 각 배열에서 필드 값의 순서와 일치해야 한다.

AddNew 메서드를 호출하면 새 레코드가 현재 레코드로 되고 Update 메서드를 호출한 뒤에도 현재 레코드로 남아 있는다. Recordset 개체가 Bookmark를 지원하지 않으면 다른 레코드로 이동한 뒤에 새 레코드에 접근할 수 없다. 사용 중인 커서 형식에 따라 Requery 메서들 호출하여 새 레코드에 접근 가능하도록 만들어야 한다.

현재 레코드를 편집하거나 새 레코드를 추가하는 동안 AddNew 메서드를 호출하면 ADO Update 메서드를 호출하여 모든 변경 내용을 저장하고 새 레코드를 만든다.

즉시 업데이트 모드(Update 메서드를 호출하면 Provider는 변경 내용을 기본 데이터 원본에 기록하는 모드 즉, BatchUpdate 모드로 Recordset 개체를 생성하지 않은 경우를 말한다.)에서 인수 없이 AddNew 메서드를 호출하면 EditMode 속성이 adEditAdd로 설정되며, Provider는 필드값 변경 내용을 지역적으로 캐시 메모리에 저장한다. Update 메서드를 호출하면 새 레코드를 데이터베이스에 저장하고 EditMode 속성을 adEditNone로 재설정 한다. Fields 인수와 Values 인수를 전달하면 Update 메서드를 호출할 필요가 없으며 ADO는 즉시 새 레코드를 데이터베이스에 저장하고 EditMode 속성값(adEditNone)은 변경되지 않는다.

일괄 업데이트 모드(BatchUpdate 모드로 Recordset 개체를 생성한 경우를 말하며, Provider는 다수의 변경 내용을 캐시에 기록했다가 UpdateBatch 메서드를 호출할 때 캐시에 저장된 변경 내용을 기본 데이터 원본에 반영한다.)에서 인수를 사용하지 않고 AddNew 메서드를 호출하면 EditMode 속성은 adEditMode로 설정된다. Provider는 필드값 변경 내용을 지역적으로 캐시에 저장한다. Update 메서드를 호출하면 새 레코드가 현재 레코드 집합에 추가되고 EditMode 속성은 adEditNone으로 재설정 된다. 그러나 Provider UpdateBatch 메서드를 호출하기 전까지는 기본 데이터베이스에 이 변경 내용을 반영하지 않는다. Fields 인수와 Values 인수를 전달하면 ADO는 캐시에 기록하기 위해서 새 레코드를 Provider에게 보내고 Provider는 현재 Recordset 개체에 새 레코드를 추가한다.

[예제1]

다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체에 새로운 레코드를 추가하는 예이다.

Private Sub cmdAddNew_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", adoCn, , , adCmdTable

   adoRs.AddNew
   adoRs!au_id = "999-99-9999"
   adoRs!au_fname = "Chris"
   adoRs!au_lname = "Choi"
   adoRs!contract = 1
   adoRs.Update

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

[예제2]

다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체에 배열 인수를 사용해서 새로운 레코드를 추가하는 예이다.

Private Sub cmdAddNew2_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String
   Dim varFields As Variant
   Dim varValues As Variant

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", adoCn, , , adCmdTable

   varFields = Array("au_id", "au_fname", "au_lname", "contract")
   varValues = Array("999-99-9998", "Chris", "Choi", 1)

   adoRs.AddNew varFields, varValues

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

Cancel 메서드

Cancel 메서드는 비동기적으로 실행한 Recordset 개체의 Open 메서드의 실행을 취소하며, 구문은 다음과 같다.

   Recordset.Cancel

이 메서드는 Recordset 개체의 Open 메서드가 adAsyncExecute 또는 adAsyncFetch와 함께 사용된 경우에 호출 실행을 중단하기 위해서 사용되며, adAsyncExecute와 함께 사용되지 않은 경우에 Cancel 메서드를 호출하면 런타임 오류가 발생한다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블을 비동기적으로 Open하고 Cancel하는 예이다. 비동기적으로 코드를 작성하고 실행할 경우에 데이터의 양이 많지 않기 때문에 비동기적인 실행과 동기적인 실행이 결과가 비슷하게 보여질 수 있다. 이 차이를 명확하게 보려면 SQL Query Analyzer에서 다음 그림과 같이 SQL 문장을 작성하고 실행한다.


[
그림] Query Analyzer 화면

위와 같은 SQL 문장을 실행하면 Pubs 데이터베이스에 Lock이 걸리게 되기 때문에 동기적인 실행은 대기 상태로 기다리게 된다. 반면에 비동기적인 실행은 정상적으로 실행이 되고, Cancel 메서드를 테스트해 볼 수 있다.

Dim adoCn As ADODB.Connection
Dim adoRs As ADODB.Recordset

Private Sub cmdOpenAsync_Click()
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", adoCn , , , adAsyncExecute
End Sub

Private Sub cmdCancel_Click()
   adoRs.Cancel
End Sub

CancelBatch 메서드

CancelBatch 메서드는 보류 중인 일괄 업데이트 작업을 취소하며, 구문은 다음과 같다.

   Recordset.CancelBatch AffectedRecords

매개변수는 다음과 같다.

매개변수

설명

AffectedRecords

선택 사항이며, CancelBatch 메서드의 영향을 받는 레코드의 개수를 결정하는 AffectEnum 값이다. 이 값은 다음 상수 중 하나의 값이다.

 

상수

설명

adAffectCurrent

현재 레코드에 대해서만 보류 중인 업데이트 작업을 취소한다.

adAffectGroup

현재 Filter 속성 설정값을 만족하는 레코드에 대해 보류 중인 업데이트 작업을 취소한다. 이 옵션을 사용하려면 Filter 속성을 미리 정의된 유효한 상수 중 하나로 설정해야 한다.

adAffectAll

기본값, 현재 Filter 속성 설정값에 따라 숨겨진 레코드를 포함해서 Recordset 개체의 모든 레코드에 대해 보류 중인 업데이트 작업을 취소한다.

BatchUpdate 모드로 생성한 Recordset 개체의 모든 보류 중인 업데이트 작업을 취소하려면 Cancel 메서드를 사용한다. Recordset 개체가 BatchUpdate 모드로 생성되지 않았을 경우에 이 메서드를 호출하면 오류가 발생한다.

현재 레코드를 편집하거나 새 레코드를 추가하는 중에 CancelBatch 메서드를 호출하면 ADO는 먼저 CancelUpdate 메서드를 호출하여 캐시에 저장된 모든 변경 내용들을 취소하고, 그 뒤에 Recordset 개체에서 보류 중인 모든 변경 내용들을 취소한다.

특히 새 레코드를 추가하는 중이었을 경우에는 CancelBatch 메서드를 호출한 뒤에 현재 레코드를 결정하지 못할 수도 있으며, 이런 이유로 인해 CancelBatch 메서드를 호출한 후에는 현재 레코드의 위치를 Recordset 개체에서 알려진 위치로 설정하는 것이 좋다. 예를 들어, MoveFirst 메서드를 호출하는 것이다.

다른 사용자가 레코드 하나를 삭제한 경우와 같이 기본 데이터와의 충돌로 인해 보류 중인 업데이트 작업을 취소하지 못할 경우, Provider Errors 컬렉션에 경고를 반환하지만, 프로그램의 실행은 멈추지 않는다. 런타임 오류는 요청된 레코드에 충돌이 있을 경우에만 발생하며, 충돌하는 레코드를 찾으려면 Filter 속성(adFilterAffectedRecords) Status 속성을 사용한다.

[예제]

다음 예제는 Pubs 데이터베이스의 Titles 테이블의 Recordset 개체를 BatchUpdate 모드로 생성하고 일부 레코드를 변경한 다음에 CancelBatch 메서드를 사용해서 변경 작업을 취소하는 예이다.

Private Sub cmdCancelBatch_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String
   Dim strTitle As String
   Dim strMessage As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockBatchOptimistic
   adoRs.Open "titles", strConn, , , adCmdTable

   adoRs.MoveFirst

   Do Until adoRs.EOF
      If Trim(adoRs!Type) = "psychology" Then
         adoRs!Type = "self_help"
      End If

      adoRs.MoveNext
   Loop

   adoRs.CancelBatch

   adoRs.MoveFirst
   Do Until adoRs.EOF
      Debug.Print adoRs!Type

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing
End Sub

CancelUpdate 메서드

CancelUpdtae 메서드는 현재 레코드의 변경 내용 또는 새로 추가되는 레코드의 입력 내용에 대한 작업을 취소하며, 구문은 다음과 같다.

   Recordset.CancelUpdate

현재 레코드에 취해진 변경 내용을 취소하거나 새로 추가된 레코드를 취소하려면 CancelUpdate 메서드를 사용한다. 변경 내용들이 RollbackTrans 메서드를 사용하여 롤백할 수 있는 트랜잭션의 일부이거나 CancelBatch 메서드를 사용해서 취소할 수 있는 일괄 업데이트 모드인 경우에는 이 메서드를 사용해서 작업 내용을 취소할 수 있다.

새 레코드를 추가하는 중에 CancelBatch 메서드를 호출하면 AddNew를 호출하기 전에 현재 상태였던 레코드가 다시 현재 레코드로 지정된다.

현재 레코드를 변경하지 않았거나 새 레코드를 추가하지 않은 상태에서 CancelBatch 메서드를 호출하면 오류가 발생한다.

[예제1]

다음 예제는 Pubs 데이터베이스의 Employee 테이블의 Recordset 개체의 레코드를 수정한 후에 CancelUpdate 메서드를 사용해서 수정 작업을 취소하는 예이다.

Private Sub cmdCancelUpdate_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "
   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "SELECT fname, lname " & _
      "FROM Employee ORDER BY lname", strConn, , , adCmdText

   adoRs!fname = "Chris"
   adoRs!lname = "Choi"

   adoRs.CancelUpdate

   Debug.Print adoRs!fname & " - " & adoRs!lname
   adoRs.Close
   Set adoRs = Nothing
End Sub

[예제2]

N다음 예제는 Pubs 데이터베이스의 Employee 테이블의 Recordset 개체에 새로운 레코드를 추가하는 중에 CancelUpdate 메서드를 사용해서 작업을 취소하는 예이다.

Private Sub cmdCancelUpdate2_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "
   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "SELECT fname, lname " & _
      "FROM Employee ORDER BY lname", strConn, , , adCmdText

   adoRs.AddNew

   adoRs!fname = "Chris"
   adoRs!lname = "Choi"

   adoRs.CancelUpdate

   Debug.Print adoRs!fname & " - " & adoRs!lname
   adoRs.Close
   Set adoRs = Nothing
End Sub

Clone 메서드

Clone 메서드는 기존의 Recordset 개체로부터 복제(Clone) 개체를 생성한다. 옵션으로 이 복제 개체를 읽기 전용으로 지정할 수도 있으며, 구문은 다음과 같다.

   Set Recordset2 = Recordset.Clone(LockType)

반환값은 Recordset 개체 참조이다.

Recordset2는 복제(Clone) 개체를 나타내며, Recordset 개체는 원본 개체이다. LockType 옵션은 복제 Recordset 개체를 읽기 전용으로 지정하는 LockTypeEnum 값이며, 지정할 수 있는 상수는 다음과 같다.

상수

설명

adLockUnspecified

기본값, 원본과 동일한 잠금 형식으로 복제(Clone) 개체를 작성한다.

adLockReadOnly

복제 개체를 읽기 전용으로 작성한다.

여러 개의 복제된 Recordset 개체를 생성하려면 Clone 메서드를 사용한다. Clone 메서드를 사용하면 원본 정의와 동일한 형태로 새 Recordset 개체를 생성하는 것보다 더 효과적으로 작업을 처리할 수 있다. 새로 작성된 복제 Recordset 개체의 현재 레코드는 첫째 레코드로 설정된다.

원본 Recordset 개체를 닫아도 복제 Recordset 개체를 닫히지 않으며, 복제 Recordset 개체 중 한 개를 닫아도 원본 Recordset 개체나 다른 복제 Recordset 개체들은 닫히지 않는다.

Bookmark를 지원하는 Recordset 개체만 복제 Recordset 개체를 만들 수 있으며, Bookmark 값은 동일하게 생성된다. , 원본 Recordset 개체의 Bookmark 참조는 복제 Recordset 개체에서도 동일한 레코드를 참조한다.

[예제]

다음 예제는 Pubs 데이터베이스의 Stores 테이블에 대한 Recordset 개체를 복제해서 원본과 복사본의 값을 비교하는 예이다.

Private Sub cmdClone_Click()
   Dim adoRs(1 To 2) As ADODB.Recordset
   Dim strConn As String
   Dim strSql As String

   strSql = "SELECT stor_name FROM Stores " & _
         "ORDER BY stor_name"
   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs(1) = New ADODB.Recordset
   adoRs(1).CursorType = adOpenStatic
   adoRs(1).LockType = adLockBatchOptimistic
   adoRs(1).Open strSql, strConn, , , adCmdText

   Set adoRs(2) = adoRs(1).Clone

   While Not adoRs(1).EOF
      Debug.Print adoRs(1)(0) & " - " & adoRs(2)(0)

      adoRs(1).MoveNext
      adoRs(2).MoveNext
   Wend

   adoRs(1).Close
   Set adoRs(1) = Nothing

   adoRs(2).Close
   Set adoRs(2) = Nothing
End Sub

Close 메서드

Close 메서드는 열려 있는 Recordset 개체를 닫으며, 구문은 다음과 같다.

   Recordset.Close

이 메서드는 Recordset 개체를 닫아서 Recordset 개체와 연관된 모든 시스템 자원을 해제한다. Recordset 개체를 Close 메서드를 사용해서 닫아도 메모리에서 지워지지는 않기 때문에 개체 속성 설정을 변경하거나 나중에 다시 열 수 있다. 메모리에서 개체를 완전히 제거하려면 개체 변수를 Nothing으로 설정한다.

Recordset 개체가 닫혀 있을 경우에 이 메서드를 사용하면 오류가 발생한다.

즉시 업데이트 모드에서 편집하고 있을 때 Close 메서드를 호출하면 오류가 발생한다. 이럴 경우에는 Update 메서드나 CancelUpdate 메서드를 먼저 호출한다. 일괄 업데이트하는 동안 Recordset 개체를 닫으면 마지막으로 UpdateBatch를 호출한 이후에 취해진 모든 변경 내용이 사라진다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체를 열고 닫는 예이다.

Private Sub cmdClose_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", adoCn, , , adCmdTable

   Debug.Print adoRs!au_id & " - " & adoRs!au_fname

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

CompareBookmarks 메서드

CompareBookmarks 메서드는 두 개의 Bookmark를 비교해서 상대 값들과의 관계를 반환하며, 구문은 다음과 같다.

   Result = Recordset.CompareBookmarks(Bookmark1, Bookmark2) As CompareEnum

이 메서드는 두 Bookmark가 나타내는 각 레코드의 상대적인 행 위치 값을 반환하며, 다음 값이 반환될 수 있다.

상수

설명

adCompareLessThan

0

첫째 Bookmark가 둘째 Bookmark 앞에 있다.

adCompareEqual

1

Bookmark는 서로 동일하다.

adCompareGreaterThan

2

첫째 Bookmark가 둘째 Bookmark 뒤에 있다.

adCompareNotEqual

3

Bookmark는 서로 다르며 순서를 지정할 수 없다.

adCompareNotComparable

4

Bookmark는 서로 비교할 수 없다.

매개변수 Bookmark1은 첫째 행의 Bookmark이며, Bookmark2는 둘째 행의 Bookmark이다.

Bookmark는 동일한 Recordset 개체에 적용되거나 또는 하나의 Recordset 개체와 이 개체의 복제 Recordset 개체에 적용되어야 한다. 동일한 원본 또는 명령을 통해서 생성한 두개의 Recordset 개체일 경우에도 서로 Bookmark를 비교할 수 없다.

Bookmark Recordset 개체에서 행을 유일하게 식별하며, 현재 행의 Bookmark를 보려면 Recordset 개체의 Bookmark 속성을 사용한다.

[예제]

다음 예제는 한 Recordset 개체의 복제(Clone) Recordset 개체를 생성한 다음 Bookmark를 비교하는 예이다.

Private Sub cmdCompareBookmarks_Click()
   Dim adoRs(1 To 2) As ADODB.Recordset
   Dim strConn As String
   Dim strSql As String
   Dim bk1 As Variant
   Dim bk2 As Variant
   Dim Result As Integer

   strSql = "SELECT stor_name FROM Stores " & _
      "ORDER BY stor_name"
   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs(1) = New ADODB.Recordset
   adoRs(1).CursorType = adOpenStatic
   adoRs(1).LockType = adLockBatchOptimistic
   adoRs(1).Open strSql, strConn, , , adCmdText

   Set adoRs(2) = adoRs(1).Clone

   bk1 = adoRs(1).Bookmark
   bk2 = adoRs(2).Bookmark

   Result = adoRs(1).CompareBookmarks(bk1, bk2)

   MsgBox "Result : " & Result

   adoRs(1).Close
   Set adoRs(1) = Nothing

   adoRs(2).Close
   Set adoRs(2) = Nothing
End Sub

 

 

Delete 메서드

Delete 메서드는 현재 레코드 또는 레코드 그룹을 삭제하며, 구문은 다음과 같다.

   Recordset.Delete AffectedRecords

매개변수 AffectedRecords Delete 메서드를 사용해서 삭제할 레코드의 개수를 결정하는 AffectEnum 값이다. 이 매개변수의 값은 다음 상수들 중 하나가 될 수 있다.

상수

설명

adAffectCurrent

기본값, 현재 레코드만 삭제한다.

adAffectGroup

현재 Filter 속성 설정값을 충족시키는 레코드를 삭제한다. 이 옵션을 사용하려면 Filter 속성을 미리 정의된 유효한 상수 중 하나로 설정해야 한다.

adAffectAll

모든 레코드를 삭제한다.

adAffectAllChapters

모든 장의 레코드를 삭제한다.

즉시 업데이트 모드일 경우에 데이터베이스에서 즉시 삭제되며, 다른 모드일 경우에 레코드는 캐시에서 삭제 표시되고 UpdateBatch 메서드를 호출할 때 실제로 삭제된다. Filter 속성을 사용해서 삭제된 레코드를 볼 수 있다.

삭제한 레코드에서 필드 값을 검색하면 오류가 발생하며, 현재 레코드를 삭제해도 다른 레코드로 이동하기 전에는 삭제된 레코드가 계속 남아 있는다. 삭제한 레코드에서 다른 레코드로 이동하면 삭제한 레코드는 더 이상 접근할 수 없다.

트랜잭션 내부에서 이 메서드를 사용할 경우에 삭제한 레코드를 RollbackTrans 메서드를 사용해서 복구할 수 있으며, 일괄 업데이트 모드에서 보류 중인 삭제 작업은 CancelBatch 메서드를 사용해서 취소할 수 있다.

다른 사용자가 이미 삭제한 레코드의 경우처럼 기본 데이터와의 충돌로 인해 레코드를 삭제할 수 없을 때, Provider Errors 컬렉션에 경고를 반환하지만 프로그램의 실행을 중단하지는 않는다. 요청된 모든 레코드에 충돌이 발생했을 때만 런타임 오류가 발생한다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블의 Recordset 개체에서 현재 레코드를 삭제하는 예이다.

Private Sub cmdDelete_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Select * from Authors Order by au_id DESC", adoCn

   adoRs.Delete

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

Find 메서드

Find 메서드는 정의된 기준에 맞는 레코드를 Recordset 개체에서 검색한다. 검색 기준을 만족하는 레코드를 찾으면 그 위치로 이동하며, 레코드를 찾지 못하면 Recordset 개체의 마지막 레코드로 이동한다.

구문은 다음과 같다.

   Recordset.Find Criteria, SkipRows, SearchDirection, Start

매개변수는 다음과 같다.

매개변수

설명

Criteria

열 이름, 비교 연산자, 검색에 사용할 값을 지정하는 문을 포함하는 문자열이며, 데이터 형식은 String 이다.

SkipRows

선택 사항, 검색을 시작할 위치를 현재 행으로부터의 거리로 지정한다.기본값은 0이며 데이터 형식은 Long이다.

SearchDirection

선택 사항, 검색 방향을 지정한다.

Start

선택 사항, 검색을 시작할 위치로 사용되는 Variant Bokkmark이다.

Criteria에 사용되는 비교 연산자에는 ">"(보다 크다), "<"(보다 작다), "="(등호), ">="(크거나 같다), "<="(작거나 같다), "<>"(같지 않다), "like"(패턴 일치) 등이 있다.

Criteria의 값은 문자열, 부동 소수점, 날짜 등이 될 수 있다. 문자열은 작은 따옴표로 구분(: "state='LA'")하며 날짜 값은 "#"(숫자 기호) 표시로 구분(: "start_date > #7/22/97#") 한다.

비교 연산자가 "like"일 경우, 문자열 값에는 "*"(하나 이상의 문자) 또는 "_"(문자 하나)를 사용할 수 있다.

[예제]

다음 예제는 Pubs 데이터데이스의 Authors 테이블에 대한 Recordset 개체에서 au_id "172-32-1176"인 레코드를 검색하는 예이다.

Private Sub cmdFind_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Select * from Authors Order by au_id DESC", adoCn

   Debug.Print adoRs!au_id

   adoRs.Find "au_id = '172-32-1176'"

   Debug.Print adoRs!au_id

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

GetRows 메서드

GetRows 메서드는 Recordset 개체의 전체 레코드들을 배열로 가져오며, 구문은 다음과 같다.

   array = Recordset.GetRows(Rows, Start, Fields)

이 메서드는 2차원 배열을 반환하며, 매개변수는 다음과 같다.

매개변수

설명

Rows

선택 사항, 검색할 레코드 개수를 나타내는 식이며 데이터 형식은 Long이다. 기본 값은 adGetRowsRest (-1)이다.

Start

선택 사항, GetRows 메서드가 실행을 시작할 레코드에 대한 Bookmark로 평가되는 값이며 데이터 형식은 String 또는 Variant이다.

Fields

선택 사항, 단일 필드 이름, 순서 위치, 필드 이름의 배열 또는 순서 위치 번호 배열을 나타내는 매개변수이며 데이터 형식은 Variant 이다. ADO는 이들 필드에 들어 있는 데이터만 반환한다.

매개변수 Start는 다음과 같은 BookmarkEnum 값 중 하나를 사용할 수도 있다.

상수

설명

adBookmarkCurrent

현재 레코드에서 시작한다.

adBookmarkFirst

첫째 레코드에서 시작한다.

adBookmarkLast

마지막 레코드에서 시작한다.

GetRows 메서드를 사용하여 Recordset 개체에서 레코드를 2차원 배열로 복사할 수 있으며, 첫째 첨자는 필드를 나타내며, 두번째 첨자는 레코드 번호를 나타낸다. Array 변수는 GetRows 메서드가 데이터를 반환할 때 배열의 차원이 정확한 크기로 자동 설정된다.

Rows 인수에 대한 값을 지정하지 않으면 Recordset 개체의 모든 레코드를 자동으로 검색한다. 사용할 수 있는 레코드보다 많은 레코드를 요청하면 이 메서드는 사용할 수 있는 레코드의 개수만 반환한다.

Recordset 개체가 Bookmark를 지원하면 GetRows 메서드가 데이터 검색을 시작할 레코드의 Bookmark 속성값을 전달하여 해당 레코드를 지정할 수 있다.

GetRows 호출이 반환할 필드를 제한하려면 단일 필드 이름/번호나 필드 이름/번호의 배열을 Fields 인수에 전달할 수 있다. GetRows를 호출한 뒤에는 읽지 않은 다음 레코다그 현재 레코드가 된다. 다음 레코드가 없으면 EOF 속성이 True로 설정된다.

[예제]

다음 예제는 Pubs 데이터베이스의 Employee 테이블에 대한 Recordset 개체를 생성하고 GetRows 메서드를 사용해서 5개의 레코드를 검색하는 예이다.

Private Sub cmdGetRows_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String
   Dim rValue As Variant
   Dim i As Integer

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.Open "SELECT fName, lName, hire_date " & _
      "FROM Employee ORDER BY lName", strConn, , , adCmdText

   rValue = adoRs.GetRows(5)

   For i = 0 To UBound(rValue, 2)
      Debug.Print rValue(0, i)
   Next i

   adoRs.Close
   Set adoRs = Nothing
End Sub

GetRows 메서드를 사용할 때 한가지 주의해야할 사항은 Recordset 개체에 들어있는 값들이 2차원 배열로 반환될 때 행과 열의 위치가 바뀐다는 점이다. 그래서 위의 예제에서 볼 수 있듯이 배열에 들어 있는 데이터를 읽을 때 행과 열을 바꿔서 읽어야 한다.

GetString 메서드

GetString 메서드는 Recordset 개체를 문자열로 반환하며, 구문은 다음과 같다.

   Set Variant = Recordset.GetString(StringFormat, NumRows, ColumnDelimiter, RowDelimiter, NullExpr)

반환값은 Recordset 개체를 문자열 값으로 반환한 Variant(BSTR) 형식의 값을 반환한다.

매개변수는 다음과 같다.

매개변수

설명

StringFormat

Recordset 개체가 adClipString 형식으로 변환되도록 지정한다. adClipString 형식으로 지정하면 행은 RowDelimiter를 사용하여 구분하고, 열은 ColumnDelimiter를 사용하여 구분하고, Null 값은 NullExpr을 사용하여 구분한다. 이들 세가지 매개변수는 adClipString을 사용할 경우에만 유효하다.

NumRows

선택사항, Recordset 개체에 들어 있는 변환할 행의 개수를 지정한다. NumRows를 지정하지 않거나 Recordset 개체의 전체 행 개수보다 큰 수를 지정하면 Recordset 개체의 모든 행이 변환된다.

ColumnDelimiter

선택사항, 열 사이에 사용할 열 구분 기호이다. 지정하지 않으면 TAB 문자가 사용된다.

RowDelimiter

선택사항, 행 사이에 사용할 행 구분 기호이다. 지정하지 않으면 Carriage Return 문자가 사용된다.

NullExpr

선택사항, Null 값 대신에 사용할 식이다. 지정하지 않으면 빈 문자열이 사용된다.

이 메서드는 스키마 데이터 대신 행 데이터가 문자열로 저장된다. 그래서 이 문자열을 사용해서 Recordset 개체를 다시 열 수 없다. 이 메서드는 RDO(Remote Data Object) GetClipString 메서드와 동일하다.

[예제]

다음 예제는 Pubs 데이터베이스의 Employee 테이블에 대한 Recordset 개체를 생성하고 GetString 메서드를 사용해서 Recordset 개체의 데이터를 문자열로 변환하는 예이다.

Private Sub cmdGetString_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String
   Dim rValue As Variant

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.Open "SELECT fName, lName, hire_date " & _
      "FROM Employee ORDER BY lName", strConn, , , adCmdText

   rValue = adoRs.GetString

   Debug.Print rValue

   adoRs.Close
   Set adoRs = Nothing
End Sub

위의 예제의 결과는 다음과 같다.

   Paolo Accorti 1992-08-27
   Pedro Afonso 1990-12-24
   Victoria Ashworth 1990-09-13
   Helen Bennett 1989-09-21
   Lesley Brown 1991-02-13
   Francisco Chang 1990-11-03
   Philip Cramer 1989-11-11
   Aria Cruz 1991-10-26
   Ann Devon 1991-07-16
   Anabela Domingues 1993-01-27
   Peter Franken 1992-05-17
   Paul Henriot 1993-08-19
   Carlos Hernadez 1989-04-21
   Palle Ibsen 1993-05-09
   Karla Jablonski 1994-03-11
   Karin Josephs 1992-10-17
   Matti Karttunen 1994-05-01
   Pirkko Koskitalo 1993-11-29
   Janine Labrune 1991-05-26
   Maria Larsson 1992-03-27

Move 메서드

Move 메서드는 Recordset 개체의 현재 레코드 위치를 이동시키며, 구문은 다음과 같다.

   Recordset.Move NumRecords, Start

매개변수는 다음과 같다.

매개변수

설명

NumRecords

현재 레코드 위치를 이동시킬 레코드의 개수를 지정하는 식이며, 데이터 형식은 Signed Long이다.

Start

선택사항, Bookmark로 평가되는 식이며, 데이터 형식은 String 또는 Variant이다.

매개변수 Start는 다음에 나열된 BookmarkEnum 값들 중 하나를 사용할 수도 있다.

상수

설명

adBookmarkCurrent

기본값, 현재 레코드에서 시작한다.

adBookmarkFirst

첫째 레코드에서 시작한다.

adBookmarkLast

마지막 레코드에서 시작한다.

Move 메서드는 모든 Recordset 개체에 대해서 지원된다.

NumRecords 인수가 0 보다 크면 현재 레코드 위치는 앞(Recordset 개체의 끝 부분)으로 이동한다.
NumRecords
인수가 0 보다 작으면 현재 레코드 위치는 뒤(Recordset 개체의 처음 부분)으로 이동한다.

이 메서드 호출이 현재 레코드 위치를 첫째 레코드의 이전으로 이동시키면 ADO는 현재 레코드를 Recordset 개체(BOF True)의 첫째 레코드 이전으로 설정한다. Recordset 개체의 BOF 속성이 True로 설정된 상태에서 이전으로 이동시키면 오류가 발생한다.

이 메서드 호출이 현재 레코드 위치를 마지막 레코드의 이후로 이동시키면 ADO는 현재 레코드를 Recordset 개체(EOF True)의 마지막 레코드 이후로 설정한다. Recordset 개체의 EOF 속성이 True로 설정된 상태에서 이후로 이동시키면 오류가 발생한다.

Empty Recordset 개체에서 Move 메서드를 호출하면 오류가 발생한다.

Start 인수를 전달하면 Recordset 개체가 Bookmark를 지원하는 경우 Bookmark가 있는 레코드에 상대적으로 이동된다. 이 인수를 지정하지 않으면 현재 레코드에 상대적으로 이동한다.

CacheSize 속성을 사용하여 Provider가 레코드를 지역적으로 캐시할 경우, 현재 레코드 위치를 캐시된 레코드의 현재 그룹 밖으로 이동시키는 NumRecords 인수를 전달하는 것은 ADO가 새 레코드 그룹을 대상 레코드에서부터 시작하여 검색하게 한다. CacheSize 속성은 새로 검색된 그룹의 크기를 결정하며, 대상 레코드는 검색된 첫째 레코드이다.

[예제]

다음 예제는 Pubs 데이터베이스의 Employee 테이블에 대한 Recordset 개체를 생성하고 Move 메서드를 사용해서 현재 레코드의 위치를 이동시키는 예이다.

Private Sub cmdMove_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.Open "SELECT fName, lName, hire_date " & _
      "FROM Employee ORDER BY lName", strConn, , , adCmdText

   adoRs.Move 10

   Debug.Print adoRs(0)

   adoRs.Close
   Set adoRs = Nothing
End Sub

MoveFirst, MoveLast, MoveNext, MovePrevious 메서드

MoveFirst, MoveLast, MoveNext, MovePrevious 메서드는 Recordset 개체에서 첫째 레코드, 마지막 레코드, 다음 레코드, 이전 레코드로 이동한 뒤에 해당 레코드를 현재 레코드로 지정하며, 구문은 다음과 같다.

   Recordset.{MoveFirst | MoveLast | MoveNext | MovePrevious}

MoveFirst 메서드는 현재 레코드의 위치를 Recordset 개체의 첫째 레코드로 이동한다.
MoveLast
메서드는 현재 레코드의 위치를 Recordset 개체의 마지막 레코드로 이동한다. Recordset 개체는 Bookmark 또는 Backword Cursor 이동을 지원해야 하며, 그렇지 않을 경우에는 오류가 발생한다.

MoveNext 메서드는 현재 레코드의 위치를 바로 다음 레코드로 이동한다. Recordset 개체는 Bookmark 또는 Backword Cursor 이동을 지원해야 하며, 그렇지 않을 경우에는 오류가 발생한다. 현재 레코드가 Recordset 개체의 마지막 레코드인 상태에서 MoveNext 메서드를 호출하면 ADO는 현재 레코드를 Recordset 개체(EOF True)의 마지막 레코드 이후로 설정한다. Recordset 개체의 EOF 속성이 True로 설정된 경우 MoveNext 메서드를 사용하면 오류가 발생한다.

MovePrevious 메서는 현재 레코드의 위치를 바로 이전 레코드로 이동한다. Recordset 개체는 Bookmark 또는 Backword Cursor 이동을 지원해야 하며, 그렇지 않을 경우에는 오류가 발생한다. 현재 레코드가 Recordset 개체의 첫째 레코드인 상태에서 MovePrevious 메서드를 호출하면 ADO는 현재 레코드를 Recordset 개체(BOF True)의 첫째 레코드의 이전으로 설정한다. Recordset 개체의 BOF 속성이 True로 설정된 경우 MovePrevious 메서드를 사용하면 오류가 발생한다.

Forward-Only Recordset 개체에서 Forward Backward를 모두 지원하려면, 레코드 캐시를 생성하는 Cache 속성을 사용해서 Move 메서드로 Backward Cursor 이동을 지원하도록 할 수 있다. 캐시된 레코드는 메모리에 저장되기 때문에 필요 이상의 레코드를 캐시하는 것은 좋지 않다. Forward-Only Recordset 개체에서 MoveFirst 메서드를 호출할 수 있으며, 이 메서드를 호출하면 Recordset 개체를 생성하는 명령을 Provider가 다시 실행하는 경우도 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체를 생성하고 MoveFirst, MoveNext, MovePrevious, MoveLast 메서드를 사용해서 현재 레코드의 위치를 이동시키는 예이다.

Private Sub cmdMoveFirst_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenStatic
   adoRs.CursorLocation = adUseClient
   adoRs.Open "authors", strConn, , , adCmdTable

   adoRs.MoveFirst
   Debug.Print adoRs(0)

   adoRs.MoveNext
   Debug.Print adoRs(0)

   adoRs.MovePrevious
   Debug.Print adoRs(0)

   adoRs.MoveLast
   Debug.Print adoRs(0)

   adoRs.Close
   Set adoRs = Nothing
End Sub

NextRecordser 메서드

NextRecordset 메서드는 다중 Recordset 개체에서 다음 Recordset 개체를 반환하는 메서드이며, 구문은 다음과 같다.

   Set Recrodset2 = Recordset1.NextRecordset(RecordsAffected)

이 메서드는 Recordset 개체를 반환하며, 위 구문에서 Recordset1 개체와 Recordset2 개체에 동일한 Recordset 개체를 사용하거나 서로 다른 개체를 사용할 수 있다.

RecordsAffected 매개변수는 선택사항이며, Provider가 현재 작업에 영향을 받는 레코드의 개수를 이 변수에 반환한다. 이 매개변수의 데이터 형식은 Long이다. 이 매개변수는 작업에 영향을 받은 레코드의 개수만 반환하며, Recordset 개체를 생성하는데 사용된 Select 문으로부터 레코드의 개수를 반환하지는 않는다.

NextRecordset 메서드를 사용해서 복합 명령문에서 다음 명령의 결과를 반환하거나 다수의 값을 반환하는 저장 프로시저의 결과를 반환한다. "Select * from Table1;Select * from Table2"와 같은 복합 명령문을 기반으로 하는 Recordset 개체를 Command 개체에서 Execute 메서드를 사용하거나 Recordset 개체에서 Open 메서드를 사용해서 열면 ADO는 첫째 명령만 실행하고 결과를 Recordset 개체에 반환한다. 복합 명령문에서 다음 명령의 결과를 접근하려면 NextRecordset 메서드를 호출해야 한다.

추가 결과가 있고 복합문을 포함하는 Recordset 개체가 프로세스 경계를 따라 마샬링되지 않는 한 NextRecordset 메서드는 계속 Recordset 개체를 반환한다. 행 반환 명령이 레코드를 반환하지 않으면 반환된 Recordset 개체는 비어 있는 것이다. BOF EOF 속성이 모두 True인지 확인하여 이런 경우를 테스트 할 수 있다. 행을 반환하지 않는 명령이 성공적으로 실행되면 반환된 Recordset 개체는 닫히고 Recordset 개체에서 State 속성을 테스트하여 이 개체의 상태를 검증할 수 있다. 결과가 더 이상 없으면 Recroset 개체는 Nothing으로 설정된다.

Remote Data Service 사용시 클라이언트 Recordset 개체에서는 NextRecordset 메서드를 사용할 수 없다.

즉시 업데이트 모드에서 편집하는 동안 이 메서드를 호출하면 오류가 발생한다. 먼저 Update 메서드나 CancelUpdate 메서드를 호출해야 한다.

Parameters 컬렉션을 채우거나 원래의 Open 또는 Execute 메서드 호출로 배열을 전달하여 복합문에서 두개 이상의 명령에 대해 매개변수를 전달하려면 컬렉션이나 배열에서 매개변수의 순서는 일련의 명령들에서 각각의 해당 명령 순서와 동일해야 한다. 그리고 출력 매개변수의 값을 읽기 전에 모든 결과 읽기를 완료해야 한다.

이 메서드를 호출할 때 ADO는 문장에서 바로 다음 명령만 실행한다. 전체 명령문을 단계별로 실행하기 전에 Recordset 개체를 명시적으로 닫으면 ADO는 나머지 명령을 실행하지 않는다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors, Stores, Jobs 테이블에 대한 Multi Recordset 개체를 생성하고 Multi Recordset 개체를 검색하는 예이다.

Private Sub cmdNextRecordset_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String
   Dim intCount As Integer

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.Open "SELECT * FROM authors; " & _
         "SELECT * FROM stores; " & _
         "SELECT * FROM jobs", strConn, , , adCmdText

   intCount = 1
   Do Until adoRs Is Nothing
      Debug.Print intCount & "
번째 Recordset 개체의 내용"

      Do While Not adoRs.EOF
         Debug.Print , adoRs.Fields(0), adoRs.Fields(1)

         adoRs.MoveNext
      Loop

      Set adoRs = adoRs.NextRecordset
      intCount = intCount + 1
   Loop
End Sub

비주얼 베이직에서 폼이 로드될 때 채워야할 콤보 박스 또는 리스트 박스와 같은 폼의 초기화에 필요한 데이터를 데이터베이스로부터 가져올 때 이 메서드를 사용하면 응용 프로그램의 성능을 높일 수 있다. 폼의 초기화에 필요한 정보를 데이터베이스로부터 각각 가져오면 데이터베이스에 여러 번 접속해야 하지만, 다중 Recordset 개체를 사용하면 한번에 여러 테이블의 정보를 가져올 수 있기 때문에 응용 프로그램의 속도를 높일 수 있다.

Open 메서드

Open 메서드는 커서를 연다. Recordset 개체를 여는 메서드이며, 구문은 다음과 같다.

   Recordset.Open Source, ActiveConnection, CursorType, LockType, Options

매개변수는 다음과 같다.

매개변수

설명

Source

선택사항, 유효한 Command 개체 변수 이름, SQL , 테이블 이름, 저장 프로시저 호출 또는 지속적인(Persisted) Recordset 개체의 파일 이름으로 평가되는 Variant 이다.

ActiveConnection

선택사항, 유효한 Connection 개체 변수 이름으로 평가되는 Variant 또는 ConnectionString 매개변수를 포함하는 String 이다.

CursorType

선택사항, Provider Recordset 개체를 열 때 사용할 커서 형식을 결정하는 CursorTypeEnum 값이다. 이 매개변수에 대한 자세한 내용은 Recordset 개체의 CursorType 속성을 참조한다.

LockType

선택사항, Provider Recordset 개체를 열 때 사용할 Lock 형식을 결정하는 LockTypeEnum 값이며, 기본값은 adLockReadOnly(1)이다. 이 매개변수에 대한 자세한 내용은 Recordset 개채의 LockType 속성을 참조한다.

Options

Source 인수로 Command 개체가 아닌 다른 것이 제시되었을 때 Provider Source 인수를 어떻게 평가해야 하는지를 나타내는 Long 값 또는 Recodrset 개체가 이전에 저장한 파일로부터 복원되야함을 나타낸다. 이 매개변수에 대한 자세한 내용은 Command 개체의 CommandType 속성을 참조한다.

CursorType 매개변수 값은 다음 상수들 중 하나가 될 수 있다.

상수

설명

adOpenForwardOnly

0

기본값, Forward-Only 형식 커서를 연다.

adOpenKeyset

1

Keyset 형식의 커서를 연다.

adOpenDynamic

2

Dynamic 형식의 커서를 연다.

adOpenStatic

3

Static 형식의 커서를 연다.

LockType 매개변수 값은 다음 상수들 중 하나가 될 수 있다.

상수

설명

adLockReadOnly

1

기본값, 읽기 전용 - 데이터를 변경할 수 없다.

adLockPessimistic

2

Pessimistic Lock, Provider는 레코드가 성공적으로 편집되도록 하기 위해 편집을 시작하면 그 즉시 데이터 원본의 레코드를 Locking 한다.

adLockOptimistic

3

Optimistics Lock, Provider Update 메서드를 호출할 경우에만 레코드를 Locking하는 Optimistics Lock을 사용한다.

adLockBatchOptimistic

4

BatchOptimistics Lock, 즉시 업데이트 모드와 대조되는 일괄 업데이트 모드에 필요한 값이다.

Options 매개변수는 다음 상수들 중 하나가 될 수 있다.

상수

설명

adCmdText

Provider Source를 명령의 텍스트 정의로 평가해야 함을 나타낸다.

adCmdTable

Source에 명명된 테이블에서 모든 행을 반환하기 위해서 ADO SQL 질의를 생성해야 함을 나타낸다.

adCmdTableDirect

Provider Source에 명명된 테이블에서 모든 행을 반환해야 함을 나타낸다.

adCmdStoredProc

Provider Source를 저장 프로시저로 평가해야 함을 나타낸다.

adCmdUnknown

Source 인수에 있는 명령 형식을 알 수 없음을 나타낸다.

adCmdFile

Persisted Recordset 개체가 Source에 명명된 파일로부터 복원되야함을 나타낸다.

adAsyncExecute

Source가 비동기적으로 실행되야함을 나타낸다.

adAsyncFetch

CacheSize 속성에 지정된 초기 양을 가져온 뒤에 나머지 행들을 비동기적으로 가져와야 한다는 것을 나타낸다.

adAsyncFetchNonBlocking

레코드를 가져오는 동안 주 스레드가 중단되지 않는다는 것을 나타낸다. 요청한 행을 가져오지 않았다면, 현재 행은 자동으로 파일의 끝으로 이동한다.

Command 개체 변수, SQL , 저장 프로시저, 테이블 이름 또는 완전한 파일 경로 이름 중 하나를 사용하여 데이터 원본을 지정하려면 옵션 매개 변수인 Source 인수를 사용한다. Source가 파일 경로 이름인 경우, 이 이름은 전체 경로("c:\dir'file.rst"), 상대 경로("..file.rst") 또는 URL (http://files/file.rst)이 될 수 있다.

Recordset 개체의 속성에 직접 대응되는 Source, CursorType, LockType 인수와 속성의 관계는 다음과 같습니다.
   - Recordset
개체를 열기 전까지는 속성에 대해 읽기와 쓰기가 모두 가능하다.
   - Open
메서드를 실행할 때 해당 인수가 전달되지 않으면 속성 설정값이 사용된다. 인수가 전달되면 그 인수는 해당 속성 설정값을 대체하고 속성 설정값이 인수 값으로 변경된다.
   - Recordset
개체를 연 다음 이들 속성은 읽기 전용이 된다.

Source 속성이 유효한 Command 개체로 설정된 Recordset 개체는 Recordset 개체가 열리지 않더라도 ActiveConnection 속성은 읽기 전용이다.

Source 인수에 Command 개체를 전달하고 ActiveConnection 인수도 전달하면 오류가 발생한다. Command 개체의 ActiveConnection 속성은 이미 유효한 Connection 개체 또는 ConnectionString으로 설정되어 있어야 한다.

Source 인수에 Command 개체가 아닌 다른 것이 전달될 경우 Options 인수를 사용해서 Source 인수의 평가를 최적화할 수 있다. Options 인수가 정의되지 않으면 ADO Provider를 호출하여 인수가 SQL문인지, 저장 프로시저인지 또는 테이블 이름인지 여부를 결정해야하기 때문에 성능이 저하될 수 있다. 사용하고 있는 Source 형식이 무엇인지 알고 있다면 Options 인수를 설정하여 ADO가 직접 관련 코드로 분기할 수 있도록 알려주어야 한다. 만약 지정한 Options 인수가 Source 형식과 일치하지 않으면 오류가 발생한다.

Recordset 개체와 연관된 Connection 개체가 없을 경우 Options 인수의 기본값은 adCmdTable이다. 일반적으로 Persisted Recodrset 개체가 여기에 해당한다.

데이터 원본이 레코드를 반환하지 않을 경우 Provider BOF EFO 속성을 모두 True로 설정하며 현재 레코드의 위치는 정의되지 않는다. CursorType이 허용한다면 새 레코드를 비어있는 이 Recodrset 개체에 추가할 수 있다.

열린 Recordset 개체에 대한 작업이 끝났다면 Close 메서드를 사용해서 연관된 시스템 자원을 모두 해제한다. 개체를 닫아도 그 개체가 메모리에서 제거되지는 않기 때문에 속성 설정 값을 변경할 수 있으며, 나중에 Open 메서드를 사용해서 그 개체를 다시 열 수도 있다. 개체를 메모리에서 완전히 제거하려면 개체 변수를 Nothing으로 설정한다.

CursorLocation 속성을 adUseClient로 설정했다면 두 가지 방법 중 하나를 사용해서 행을 비동기적으로 검색할 수 있으며, Options adAsyncFetch로 설정하는 방법이 좋다. 다른 방법으로 Properties 컬렉션에 들어 있는 Asynchronous Rowset Processing Dynamic 속성을 사용할 수 있지만, Oprions 매개변수를 adAsyncFetch로 설정하지 않으면 관련있는 검색된 이벤트를 상실할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체를 Open 메서드를 사용해서 여는 예제이다.

Private Sub cmdOpen_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", adoCn, , , adCmdTable

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

Requery 메서드

Requery 메서드는 Recordset 개체를 생성한 질의를 다시 실행하여 Recodrset 개체에 있는 데이터를 갱신하며, 구문은 다음과 같다.

   Recordset.Requery Options

매개변수 Options는 선택사항이며, 이 작업에 영향을 주는 옵션을 나타내는 Bit Mask이다. 이 매개변수가 adSayncExecute로 설정되면 이 작업은 비동기적으로 실행되면 마지막에 RecordsetChangeComplete 이벤트가 발생한다.

명령을 재실행하고 데이터를 다시 검색하는 방법을 사용해서 데이터 원본에 있는 Recodrset 개체의 전체 내용을 새로 고치려면 이 메서드를 사용한다. 이 메서드를 호출하는 것은 Close Open 메서드를 차례로 호출하는 것과 같다.

Recordset 개체가 열려 있는 동안에 커서의 특징을 정의하는 속성(CursorType, LockType, MaxRecords )은 읽기 전용이다. 그러므로 Requery 메서드는 현재 커서만 새로 고칠 수 있다. 커서 속성을 변경하고 그 결과를 보려면 Close 메서드를 사용해서 속성에 대해 읽기와 쓰기를 모두 할 수 있도록 만들어야 한다. 그런 다음에 속성 설정 값을 변경하고 Open 메서드를 호출하여 커서를 다시 연다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체를 생성한 다음, Connection 개체의 Execute 메서드를 사용해서 레코드를 변경하고 Recordset 개체의 Requery 메서드를 사용해서 변경된 내용을 다시 조회하는 예이다.

Private Sub cmdRequery_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", adoCn, , , adCmdTable

   Debug.Print adoRs!au_id & " - " & adoRs!au_fname

   adoCn.Execute "Update Authors Set au_fname = 'Chris' Where au_id = '409-56-7008' "

   adoRs.Requery
   Debug.Print adoRs!au_id & " - " & adoRs!au_fname

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

Resync 메서드

Resync 메서드는 기본 데이터베이스로부터 현재 Recordset 개체의 데이터를 갱신하며, 구문은 다음과 같다.

   Recordset.Resync AffectRecords, ResyncValues

매개변수는 다음과 같다.

매개변수

설명

AffectRecords

선택사항, Resync 메서드가 영향을 줄 레코드 개수를 결정하는 AffectEnum 값이다.

ResyncValues

 

매개변수 AffectRecords는 다음 상수 중 하나가 될 수 있다.

상수

설명

adAffectCurrent

현재 레코드만 새로 고친다.

aAdAffectGroup

현재 Filter 속성 설정값을 만족하는 레코드를 새로 고친다. 이 옵션을 사용하려면 Filter 속성을 사전 정의된 유효한 상수 중 하나로 설정해야 한다.

adAffectAll

기본값, 현재 Filter 속성 설정값에 의해 숨겨져 있는 레코드를 포함하여 Recordset 개체의 모든 레코드를 새로 고친다.

adAffectAllChapters

모든 장(Chapter)의 레코드를 새로 고친다.

매개변수 ResyncValues는 다음 상수 중 하나가 될 수 있다.

상수

설명

adResyncAllValues

기본값, 데이터가 덮어 쓰여지고 보류 중인 변경은 취소된다.

adResyncUnderlyingValues

데이터가 덮어 쓰여지지 않고 보류 중인 변경도 취소되지 않는다.

현재 Recordset 개체에 있는 레코드를 기본 데이터베이스와 다시 동기화하려면 Reqync 메서드를 사용한다. 이 메서드는 Static 커서 또는 Forward-Only 커서를 사용하면서 기본 데이터베이스의 변경 내용을 볼 때 유용하다.

CursorLocation 속성을 adUseClient로 설정하면 Resync는 읽기 전용이 아닌 Recordset 개체에서만 사용할 수 있다.

Requery 메서드와 달리 Resync 메서드는 Recordset 개체의 기본 명령을 다시 실행하지 않는다. , 기본 데이터베이스에 있는 새로운 레코드를 볼 수 없다.

기본 데이터베이스와의 충돌 때문에 재동기화가 이루어지지 못하면(: 다른 사용자가 레코드를 삭제한 경우), Provider Errors 컬렉션에 오류를 반환하고 런타임 오류가 발생한다. Filter 속성(adFilterConflictingRecords) Status 속성을 사용하여 충돌이 발생한 레코드를 찾을 수 있다.

Remote Data Service 사용시 Resync 메서드는 클라이언트 Recordset 에서 사용할 수 없다.

[예제]

다음 예제는 Pubs 데이터베이스의 Titles 테이블에 대한 Recordset 개체를 생성하고, Resync 메서드를 사용하여 정적 레코드 집합에 있는 데이터를 새로 고치는 것을 보여주는 예이다.

Private Sub cmdResync_Click()
   Dim strConn As String
   Dim adoRs As ADODB.Recordset

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.CursorLocation = adUseClient
   adoRs.CursorType = adOpenStatic
   adoRs.LockType = adLockBatchOptimistic
   adoRs.Open "titles", strConn, , , adCmdTable

   adoRs!Type = "database"

   MsgBox "Before resync: " & vbCr & vbCr & _
      "Title - " & adoRs!Title & vbCr & _
      "Type - " & adoRs!Type

   adoRs.Resync

   MsgBox "After resync: " & vbCr & vbCr & _
      "Title - " & adoRs!Title & vbCr & _
      "Type - " & adoRs!Type

   adoRs.CancelBatch

   adoRs.Close
   Set adoRs = Nothing
End Sub

Save 메서드

Save 메서드는 파일로 Recordset 개체를 저장하며, 구문은 다음과 같다.

   Recordset.Save FileName, PersistFormat

매개변수는 다음과 같다.

매개변수

설명

FileName

선택사항, Recordset 개체가 저장될 파일의 완전한 경로 이름

PersistFormat

선택사항, Recordset 개체가 저장될 형식을 지정하는 PersistFormatEnum 값이다.

매개변수 PersistFormat은 다음 상수 중 하나가 될 수 있다.

상수

설명

adPersistADTG

0

기본값, 전용 Advanced Data TableGram 형식으로 저장한다.

adPersistXML

1

XML 형식으로 저정한다.

Save 메서드는 열린 Recordset 개체에서만 호출할 수 있다. 저장된 Recordset 개체는 나중에 Open 메서드를 사용해서 복원할 수 있다.

Recordset 개체에 Filter 속성이 적용되면 필터링된 상태에서 접근할 수 있는 행만 저장된다. Recordset 개체가 계층 구조이면 하위 Recordset 개체를 포함해서 현재 Recordset 개체가 저장되며 상위 Recordset 개체는 저장되지 않는다.

Recordset 개체를 처음으로 저장할 때 FileName을 지정하며, 다음에 Save 메서드를 호출할 때는 FileName을 생략해야 한다. 그렇지 않으면 런타임 오류가 발생한다. 다음 번에 새로운 FileName으로 Save 메서드를 호출하면 Recordset 개체는 새로운 파일에 저장된다.

Save 메서드를 호출해도 Recordset 개체나 FileName이 닫히지는 않으므로 Recordset 개체를 사용해서 작업을 계속할 수 있으며, 가장 최근의 변경 사항을 저장할 수도 있다. FileName Recordset 개체를 닫을 때까지 계속 열려 있으며, 다른 응용 프로그램이 FileName의 데이터를 읽을 수는 있지만, FileName에 쓸 수는 없다.

보안상의 이유로 Microsoft Internet Explorer에서 실행되는 스크립트에서 Save 메서드에 "낮음" 보안 설정과 "사용자 정의" 보안 설정만 사용할 수 있다.

비동기 Recordset 가져오기, 실행 또는 업데이트가 진행되는 동안 Save 메서드를 호출하면 비동기 작업이 완료될 때까지 Save 메서드는 대기 상태에 있는다.

Save 메서드를 완료하면 현재 행 위치는 Recordset 개체의 첫째 행이 된다.
최상의 결과를 얻기 위해 Save 메서드에 CursorLocaion 속성을 adUseClient로 설정한다. Provider Recordset 개체를 저장하는데 필요한 모든 기능을 지원하지 않으면 클라이언트 커서가 해당 기능을 제공한다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체를 생성하고, Save 메서드를 사용하여 Recordset 개체를 물리적인 파일로 저장하는 예이다.

Private Sub cmdSave_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", adoCn, , , adCmdTable

   adoRs.Save "c:\temp\authors.dat", adPersistXML

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

Seek 메서드

Seek 메서드는 Recordset 개체의 인덱스를 검색하여 지정한 값과 일치하는 행을 찾고 현재 행의 위치를 해당 행으로 변경하며, 구문은 다음과 같다.

   Recordset.Seek KeyValues, SeekOptions

매개변수는 다음과 같다.

매개변수

설명

KeyValues

하나 이상의 열로 구성된 인덱스이거나 해당하는 각 열에 대하여 비교 대상이 될 값이 들어 있는 배열이며, Variant 값들의 배열이다.

SeekOptions

인덱스 열과 해당 KeyValues 사이의 비교 방법을 지정하며, 데이터 형식은 SeekEnum 값이다.

매개변수 SeekOptions는 다음의 비교 상수를 사용할 수 있다.

상수

설명

adSeekAfterEQ

KeyValues와 일치한 바로 뒤의 키나 동일한 키를 찾는다.

adSeekAfter

KeyValues와 일치한 바로 뒤의 키를 찾는다.

adSeekBeforeEQ

KeyValues와 일치한 바로 앞의 키나 동일한 키를 찾는다.

adSeekBefore

KeyValues와 일치한 바로 앞의 키를 찾는다.

adSeekFirstEQ

KeyValues와 동일한 첫 키를 찾는다.

adSeekLastEQ

KeyValues와 동일한 마지막 키를 찾는다.

기본 Provider Recordset 개체에 대하여 인덱스를 지원할 때 Seek 메서드를 Index 속성과 함께 사용한다. 기본 Provider가 인덱스를 지원하는지를 알아보려면 Support(adIndex) 메서드를 사용한다.

Seek 메서드는 원하는 행을 찾을 수 없어도 오류를 발생시키지 않고 행을 파일 끝(EOF)로 위치시킨다. 이 메서드를 실행하기 전에 Index 속성을 원하는 인덱스에 지정한다.

이 메서드는 Recordset 개체의 CursorLocation 속성이 adUseClient가 아닌 값을 가질 때만 사용할 수 있다.

[예제]

다음 예제는 NWIND.MDB Employees 테이블에 대한 Recordset 개체를 생성하고, Seek 메서드를 사용하여 특정 EmployeeID를 검색하는 예이다.

Private Sub cmdSeek_Click()
   Dim adoRs As ADODB.Recordset
   Dim strID As String

   Set adoRs = New ADODB.Recordset
   adoRs.CursorLocation = adUseServer
   adoRs.Open "employees", _
         "Provider=Microsoft.Jet.OLEDB.4.0;" & _
         "Data Source=nwind.mdb;" & _
         "user id=admin;password=;", _
         adOpenKeyset, adLockReadOnly, adCmdTableDirect

   If adoRs.Supports(adIndex) And adoRs.Supports(adSeek) Then
      adoRs.Index = "EmployeeId"

      adoRs.MoveFirst
      Do
         strID = LCase(Trim(InputBox("Enter an EmployeeID (e.g., 1 to 9)", "Seek Example")))
         If Len(strID) = 0 Then Exit Do
         If Len(strID) = 1 And strID >= "1" And strID <= "9" Then
            adoRs.Seek Array(strID), adSeekAfterEQ
            If adoRs.EOF Then
               Debug.Print "Employee not found."
            Else
               Debug.Print strID; ": Employee='"; adoRs!firstname; " "; _
               adoRs!LastName; "'"
            End If
         End If
      Loop
   End If

   adoRs.Close
   Set adoRs = Nothing
End Sub

Supports 메서드

Supports 메서드는 Recordset 개체가 특정 기능을 지원하는 지의 여부를 결정하며, 구문은 다음과 같다.

   Boolean = Recordset.Supports(CursorOptions)

반환값은 CursorOptions 인수에 지정된 모든 기능을 지원하는 지의 여부를 나타내는 Boolean 값을 반환한다.

매개변수 CursorOptions는 다음과 같은 CursorOptionEnum 값이 하나 이상 포함되어 구성된 Long 식이다.

매개변수

설명

adAddNew

AddNew 메서드를 사용하여 새 레코드를 추가할 수 있다.

adApproxPosition

AbsolutePosition AbsolutePage 속성을 읽고 설정할 수 있다.

adBookmark

Bookmark 속성을 사용하여 특정 레코드를 접근할 수 있다.

adDelete

Delete 메서드를 사용하여 레코드를 삭제할 수 있다.

adHoldRecords

보류 중인 모든 변경 내용을 Commit하지 않고도 더 많은 레코드를 검색하거나 다음 검색 위치를 변경할 수 있다.

adMovePrevious

Bookmark 없이 MoveFirst, MovePrevious 메서드, Move 또는 GetRows 메서드를 사용하여 현재 레코드 위치를 뒤로 이동할 수 있다.

adResync

Resync 메서드를 사용하여 커서를 기본 데이터베이스에서 볼 수 있는 데이터로 갱신할 수 있다.

adUpdate

Update 메서드를 사용하여 기본 데이터를 수정할 수 있다.

adUpdateBatch

일괄 업데이트(UpdateBatch CancelBatch 메서드)를 사용하여 Provider에게 변경 그룹을 전송할 수 있다.

adIndex

Index 속성을 사용하여 인덱스의 이름을 지정할 수 있다.

adSeek

Seek 메서드를 사용하여 Recordset 개체에서 행을 찾을 수 있다.

Supports 메서드를 사용하여 어떤 종류의 기능을 Recordset 개체가 지원하는지 결정할 수 있다. Recordset 개체가 CursorOptions에 있는 상수에 해당하는 기능을 지원할 경우 Supports 메서드는 True를 반환한다. 그렇지 않을 경우에는 False를 반환한다.

Supports 메서드가 주어진 기능에 대해 True를 반환할지라도 Provider가 모든 상황에서 그 기능을 지원한다고 볼 수는 없다. Supports 메서드는 모든 조건이 갖추어졌다고 가정한 상태에서 Provider가 지정된 기능을 지원하는지의 여부를 반환한다. 예를 들어, 커서가 다중 테이블 조인을 기초로 하고 있어서 일부 열을 업데이트할 수 없음에도 불구하고 Supports 메서드는 Recordset 개체가 업데이트를 지원한다고 응답하는 경우가 있을 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체를 생성하고, Supports 메서드를 사용하여 Recordset 개체의 특성을 검색하는 예이다.

Private Sub cmdSupports_Click()
   Dim adoCn As ADODB.Connection
   Dim adoRs As ADODB.Recordset
   Dim strConn As String

   Set adoCn = New ADODB.Connection
   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
   adoCn.Open strConn

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", adoCn, , , adCmdTable

   Debug.Print "AddNew : " & adoRs.Supports(adAddNew)
   Debug.Print "adApproxPosition : " & adoRs.Supports(adApproxPosition)
   Debug.Print "adResync : " & adoRs.Supports(adResync)
   Debug.Print "adUpdate : " & adoRs.Supports(adUpdate)

   adoRs.Close
   Set adoRs = Nothing

   adoCn.Close
   Set adoCn = Nothing
End Sub

Update 메서드

Update 메서드는 Recordset 개체의 현재 레코드에 대한 변경 내용을 저장하며, 구문은 다음과 같다.

   Recordset.Update Fields, Values

매개변수는 다음과 같다.

매개변수

설명

Fields

선택사항, 단일 이름을 나타내는 Variant 또는 필드의 이름들이나 순서 위치들 또는 수정할 필드들을 나타내는 Variant 배열이다.

Values

선택사항, 단일 값을 나타내는 Variant 또는 필드의 값들 또는 새 레코드에 있는 필드들을 나타내는 Variant 배열이다.

AddNew 메서드를 호출한 이후 또는 기존 레코드에 있는 필드값을 변경한 이후에 Recordset 개체의 현재 레코드에서 변경한 내용이 있을 경우 Update 메서드를 사용하여 저장한다. Recordset 개체는 반드시 업데이트를 지원해야 한다.

필드값을 설정하려면 다음 중 하나를 수행한다.
   - Field
개체의 Value 속성에 값을 지정하고 Update 메서드를 호출한다.
   - Update
메서드를 호출할 때 필드 이름과 값을 인수로 사용하여 전달한다.
   - Update
메서드를 호출할 때 필드 이름 배열과 값 배열을 전달한다.

필드와 값으로 이루어진 배열을 사용할 경우 양쪽 배열에는 같은 수의 요소가 있어야 한다. 또한 필드 이름 순서가 필드 값의 순서와 일치해야 한다. 필드와 값에 대한 개수와 순서가 일치하지 않으면 오류가 발생한다.

Recordset 개체가 일괄 업데이트를 지원하면 UpdateBatch 메서드를 호출하기 전까지 하나 이상의 레코드의 여러 변경 내용을 로컬에 캐싱할 수 있다. UpdateBatch 메서드를 호출할 때 현재 레코드를 편집하거나 새 레코드를 추가하면 ADO는 일괄 변경 내용을 Provider에게 전송하기 전에 자동으로 Update 메서드를 호출하여 보류 중인 변경 내용을 현재 레코드에 저장한다.

Update 메서드를 호출하기 전에 추가하거나 편집하고 있는 레코드로부터 이동하면 ADO는 자동으로 Update 메서드를 호출하여 변경 내용을 저장한다. 현재 레코드의 변경 내용을 취소하거나 새로 추가된 레코드를 삭제하려면 CancelUpdate 메서드를 호출한다.

현재 레코드는 Update 메서드를 호출한 후에도 현재 레코드로 남아 있는다.

사용예는 AddNew 메서드의 예제를 참조한다.

UpdateBatch 메서드

UpdateBatch 메서드는 보류 중인 모든 일괄 업데이트 내용을 디스크에 기록하며, 구문은 다음과 같다.

   Recordset.UpdateBAtch AffectRecords

매개변수 AffectRecords UpdateBatch 메서드의 영향을 받을 레코드 수를 결정하는 AffectEnum 값이며, 이 매개변수는 다음 상수들 중 하나가 될 수 있다.

상수

설명

adAffectCurrent

보류 중인 변경 내용 중 현재 레코드에 대한 내용만 기록한다.

adAffectGroup

보류 중인 변경 내용 중 현재 Filter 속성값을 만족하는 레코드에 대한 내용만 기록한다. 이 옵션을 사용하려면 Filter 속성을 미리 정의된 유효한 상수로 설정해야 한다.

adAffectAll

기본값, 현재 Filter 속성 설정값에 의해 숨겨져 있는 레코드를 포함하여 Recordset 개체의 모든 레코드에 대한 보류 중인 변경 내용을 기록한다.

adAffectAllChapters

모든 Chapter에 대한 보류 중인 변경 사항을 기록한다.

일괄 업데이트 모드에서 Recordset 개체를 수정할 때 UpdateBatch 메서드를 사용하여 Recordset 개체에 대한 모든 변경 내용을 기본 데이터베이스로 전송할 수 있다.

Recordset 개체가 일괄 업데이트를 지원할 경우 UpdateBatch 메서드를 호출하기 전까지 하나 이상의 레코드에 대해 수행된 다수의 변경 내용을 지역적으로 임시 저장한다. 이 메서드를 호출한 때 현재 레코드를 편집하거나 새 레코드를 추가하는 경우, ADO는 일괄 변경 내용을 Provider에게 전송하기 전에 자동으로 Update 메서드를 호출하여 보류 중인 변경 내용을 현재 레코드에 저장한다.

일괄 업데이트는 반드시 Keyset 또는 Static 커서와 함께 사용해야 한다.

기본 데이터와 충돌하여 임의의 레코드나 모든 레코드의 변경 내용을 전송하는데 실패하면(, 다른 사용자가 이미 레코드를 삭제한 경우) Provider Errors 컬렉션에 경고를 반환하고 런타임 오류가 발생한다. Filter 속성(adFilterAffectedRecords) Status 속성을 사용하여 충돌하는 레코드를 찾을 수 있다.

보류 중인 모든 일괄 업데이트를 취소하려면 CancelBatch 메서드를 사용한다.

[예제]

다음 예제는 Pubs 데이터베이스의 Titles 테이블에 대한 Recordset 개체를 생성하고, UpdateBatch 메서드를 사용하여 일괄 업데이트하는 예이다.

Private Sub cmdUpdateBatch_Click()
   Dim adoRs As ADODB.Recordset
   Dim strConn As String
   Dim strTitle As String
   Dim strMessage As String

   strConn = "Provider=sqloledb;" & _
      "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockBatchOptimistic
   adoRs.Open "titles", strConn, , , adCmdTable

   adoRs.MoveFirst

   Do Until adoRs.EOF
      If Trim(adoRs!Type) = "psychology" Then
         adoRs!Type = "self_help"
      End If

      adoRs.MoveNext
   Loop

   adoRs.UpdateBatch

   adoRs.MoveFirst
   Do Until adoRs.EOF
      Debug.Print adoRs!Type

      adoRs.MoveNext
   Loop

   adoRs.Close
   Set adoRs = Nothing
End Sub

 

ADO Connection 개체와 Recordset 개체에서 이벤트를 제공하고 있으며, Command 개체는 이벤트를 제공하지 않는다.

Recordset 개체의 이벤트는 다음과 같다.

이벤트

설명

EndOfRecordset

Recordset 개체의 마지막 행 다음으로 이동려고 할 때 발생한다.

FetchComplete

비동기적 작업에 의해서 모든 레코드들이 Recordset 개체로 검색된 후에 발생한다.

FetchProgress

비동기적 작업을 수행하는 동안 현재 Recordset 개체로 가져온 행 수를 보고하기 위해서 주기적으로 발생한다.

FieldChangeComplete

Field 개체의 값이 하나 이상 변경된 후에 발생한다.

MoveComplete

Recordset 개체에서 현재 위치를 변경한 후에 발생한다.

RecordChangeComplete

레코드가 하나 이상 변경된 후에 발생한다.

RecordsetChangeComplete

Recordset 개체가 변경된 후에 발생한다.

WillChangeField

보류 중인 작업이 Recordset 개체에 있는 하나 이상의 Field 개체 값을 변경하기 전에 발생한다.

WillChangeRecord

Recordset 개체에서 하나 이상의 레코드가 변경되기 전에 발생한다.

WillChangeRecordset

보류 중인 작업이 Recordset 개체를 변경하기 전에 발생한다.

WillMove

보류 중인 작업이 Recordset 개체에서 현재 위치를 변경하기 전에 발생한다.

ADO Recordset 개체의 이벤트를 사용하기 위해서 비주얼 베이직에서 ADODB.Recordset 개체를 선언할 때 WithEvents 문으로 다음과 같이 기술해야 한다.

   Dim WithEvents adoRs As ADODB.Recordset

위와 같이 코딩을 하면 비주얼 베이직의 코드 편집창에 다음 그림과 같이 이벤트에 대한 목록이 나타난다.


[
그림] Recordset 개체의 이벤트

Recordset 개체의 이벤트를 사용하기 위해서는 WithEvents 문과 함께 adoRs 변수를 선언하게 되는데, 이 경우에는 변수를 선언할 때 New 키워드를 함께 사용할 수 없으며, Recordset 개체를 사용하기 전에 Recordset 개체의 새로운 인스턴스를 다음과 같은 코드로 생성해야 한다.

   Set adoRs = New ADODB.Recordset

EndOfRecordset 이벤트

EndOfRecordset 이벤트는 Recordset 개체의 마지막 행 다음으로 이동려고 할 때 발생하며, 구문은 다음과 같다.

   EndOfRecordset fMoreData, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

fMoreData

이 이벤트를 처리하는 동안 새로운 레코드를 pRecordset에 추가할 수 있으며, EndOfRecordset 이벤트가 어떤 값을 반환하기 전에 데이터를 추가하고 이 매개변수를 True로 설정하여 Recordset 개체에 새로운 마지막 레코드가 있음을 나타내기 위해서 사용한다. 데이터 형식은 VARIANT_BOOL이다.

adStatus

EventStatusEnum 상태값이다. EndOfRecordset이 호출될 때, 이벤트를 발생시킨 작업이 성공하면 이 매개변수는 adStatusOK로 설정된다. 이 메서드가 이벤트를 발생시킨 작업의 취소를 요청할 수 없으면 adStatusCantDeny로 설정된다.EndOfRecordset이 어떤 값을 반환하기 전에 이 매개변수를 adStatusUnwantedEvent로 설정하여 계속되는 통지(Notification)를 막을 수 있다.

pRecordset

이 이벤트가 발생한 Recordset 개체를 나타낸다.

Recordset.MoveNext가 실패할 경우 EndOfRecordset 이벤트가 발생할 수 있다.

이 이벤트 처리기는 사용자가 pRecordset 개체의 마지막 행 다음으로 이동하려고 할 때 호출되며 MoveNext를 호출한 결과일 수 있다. 그러나 이 메서드가 수행되는 동안 사용자는 데이터베이스에 추가로 레코드를 검색하여 그 레코드를 pRecordset 개체의 끝에 추가할 수 있다. 이런 경우 사용자는 EndOfRecordset 이벤트 프로시저에서 fMoreData VARIANT_TRUE로 설정한다. 그런 다음 사용자는 MoveNExt를 다시 호출하여 새로 검색된 레코드를 접근할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체를 생성하고, Recordset 개체의 마지막 레코드의 다음으로 이동하려고 할 때, 발생하는 EndOfRecordset 이벤트의 예이다.

Dim WithEvents adoRs As ADODB.Recordset

Private Sub adoRs_EndOfRecordset(fMoreData As Boolean, _
   adStatus As ADODB.EventStatusEnum, _
   ByVal pRecordset As ADODB.Recordset)

   MsgBox pRecordset.EOF
End Sub

Private Sub cmdEndOfRecordset_Click()
   Set adoRs = New Recordset

   adoRs.Open "authors", "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;", _
      adOpenStatic, adLockOptimistic

   adoRs.MoveLast

   adoRs.MoveNext
End Sub

FetchComplete 이벤트

FetchComplete 이벤트는 비동기적 작업에 의해서 모든 레코드들이 Recordset 개체로 검색된 후에 발생하며, 구문은 다음과 같다.

   FetchComplete pError, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

pError

Error 개체이다. adStatus의 값이 adStatusErrorsOccurred일 때 발생한 오류를 설명한다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

EventStatusEnum 상태값이다. 이 매개변수는 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.FetchComplete가 어떤 값을 반환하기 전에 이 매개변수를 adStatusUnwantedEvent로 설정하여 계속되는 통지(Notification)를 막을 수 있다.

pRecordset

검색된 레코드를 포함할 Recordset 개체이다.

이 이벤트는 비주얼 베이직 6.0 이상의 버전에서만 사용할 수 있다.

FetchProgress 이벤트

FetchProgress 이벤트는 비동기적 작업을 수행하는 동안 현재 Recordset 개체로 가져온 행 수를 보고하기 위해서 주기적으로 발생하며, 구문은 다음과 같다.

   FetchProgress Progress, MaxProgress, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

Progress

현재 검색된 레코드 수를 나타내며, 데이터 형식은 Long이다.

MaxProgress

예상되는 최대 검색 레코드 수를 나타내며, 데이터 형식은 Long이다.

adStatus

EventStatusEnum 상태값이다.

pRecordset

검색된 레코드들을 포함할 Recordset 개체이다.

FieldChangeComplete 이벤트

FieldChangeComplete 이벤트는 Field 개체의 값이 하나 이상 변경된 후에 발생하며, 구문은 다음과 같다.

   FieldChangeComplete cFields, Fields, pError, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

cFields

Fields 컬렉션에 있는 Field 개체의 개수를 나타내며, 데이터 형식은 Long이다.

Fields

보류 중인 변경 내용을 가진 Field 개체를 포함하는 Variant 배열이다.

pError

Error 개체이다. adStatus의 값이 adStatusErrorsOccurred일 때 발생한 오류를 설명한다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

EventStatusEnum 상태값이다. 이 매개변수는 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.FieldChangeComplete가 어떤 값을 반환하기 전에 이 매개변수를 adStatusUnwantedEvent로 설정하여 계속되는 통지(Notification)를 막을 수 있다.

pRecordset

이 이벤트가 발생한 Recordset 개체를 나타낸다.

Recordset 개체의 Value 및 필드와 값의 배열 매개변수를 가진 Update 작업으로 인해 FieldChangeComplete 이벤트가 발생할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블을 Recordset 개체로 생성하고, AddNew 메서드를 사용해서 새로운 레코드를 추가할 때 필드의 값이 변경되면 FieldChangeComplete 이벤트가 발생하는 예이다.

Private Sub adoRs_FieldChangeComplete(ByVal cFields As Long, _
      ByVal Fields As Variant, ByVal pError As ADODB.Error, _
      adStatus As ADODB.EventStatusEnum, _
      ByVal pRecordset As ADODB.Recordset)

   MsgBox "FieldChangeComplete"
End Sub

Private Sub cmdFieldChangeComplete_Click()
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"

   Set adoRs = New ADODB.Recordset

   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", strConn, , , adCmdTable

   adoRs.AddNew
   adoRs!au_id = "999-99-9997"
   adoRs!au_fname = "Chris"
   adoRs!au_lname = "Choi"
   adoRs!contract = 1
   adoRs.Update

   adoRs.Close
   Set adoRs = Nothing
End Sub

MoveComplete 이벤트

MoveComplete 이벤트는 Recordset 개체에서 현재 위치를 변경한 후에 발생하며, 구문은 다음과 같다.

   MoveComplete adReason, pError, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

adReason

EventReasonEnum 값이다. 이 이벤트를 발생시킨 원인을 나타낸다. adReason의 값은 adRsnMoveFirst, adRsnMoveLast, adRsnMoveNext, adRsnMovePrevious, adRsnMove, adRsnRequery가 될 수 있다.

pError

Error 개체이다. adStatus의 값이 adStatusErrorsOccurred일 때 발생한 오류를 설명한다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

EventStatusEnum 상태값이다. 이 매개변수는 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.MoveComplete가 어떤 값을 반환하기 전에 이 매개변수를 adStatusUnwantedEvent로 설정하여 계속되는 통지(Notification)를 막을 수 있다.

pRecordset

이 이벤트가 발생한 Recordset 개체를 나타낸다.

이 이벤트는 Open, Move, MoveFirst, MoveLast, MoveNext, MovePrevious, Bookmark, AddNew Resync와 같은 Recordset 개체의 작업으로 인해 발생할 수 있으며, Filter, Index, AbsolutePage AbsolutePosition 속성으로 인해 발생할 수도 있다.

또한, 하위 Recordset 개체에 연결된 Recordset 이벤트가 있고 상위 Recordset 개체가 이동한 경우에도 이 이벤트는 발생할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Employee 테이블을 Recordset 개체로 생성하고, Move 메서드를 사용해서 MoveComplete 이벤트를 발생시키는 예이다.

Private Sub adoRs_MoveComplete( _
      ByVal adReason As ADODB.EventReasonEnum, _
      ByVal pError As ADODB.Error, _
      adStatus As ADODB.EventStatusEnum, _
      ByVal pRecordset As ADODB.Recordset)

   MsgBox "MoveComplete"
End Sub

Private Sub cmdMoveComplete_Click()
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.Open "SELECT fName, lName, hire_date " & _
      "FROM Employee ORDER BY lName", strConn, , , adCmdText

   adoRs.Move 10

   adoRs.Close
   Set adoRs = Nothing
End Sub

 

 

RecordChangeComplete 이벤트

RecordChangeComplete 이벤트는 레코드가 하나 이상 변경된 후에 발생하며, 구문은 다음과 같다.

   RecordChangeComplete adReason, cRecords, pError, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

adReason

EventReasonEnum 값이다. 이 이벤트를 발생시킨 원인을 나타낸다. adReason의 값은 adRsnAddNew, adRsnDelete, adRsnUpdate, adRsnUndoUpdate, adRsnUndoAddNew, adRsnUndoDelete, adRsnFirstChange가 될 수 있다.

cRecords

영향을 받은 레코드의 수를 나타내며, 데이터 형식은 Long이다.

pError

Error 개체이다. adStatus의 값이 adStatusErrorsOccurred일 때 발생한 오류를 설명한다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

EventStatusEnum 상태값이다. 이 매개변수는 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.RecordChangeComplete가 어떤 값을 반환하기 전에 이 매개변수를 adStatusUnwantedEvent로 설정하여 계속되는 통지(Notification)를 막을 수 있다.

pRecordset

이 이벤트가 발생한 Recordset 개체를 나타낸다.

Update, Delete, CancelUpdate, AddNew, UpdateBatch CancelBatch와 같은 Recordset 개체의 작업으로 인해 행에서 처음으로 변경된 필드에 대해 RecordChangeComplete 이벤트가 발생할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블을 Recordset 개체로 생성하고, Update 메서드를 사용해서 RecordChangeComplete 이벤트를 발생시키는 예이다.

Private Sub adoRs_RecordChangeComplete( _
      ByVal adReason As ADODB.EventReasonEnum, _
      ByVal cRecords As Long, ByVal pError As ADODB.Error, _
      adStatus As ADODB.EventStatusEnum, _
      ByVal pRecordset As ADODB.Recordset)

   MsgBox "RecordChangeComplete"
End Sub

Private Sub cmdRecordChangeComplete_Click()
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"

   Set adoRs = New ADODB.Recordset

   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", strConn, , , adCmdTable

   adoRs!au_id = "999-99-9997"
   adoRs!au_fname = "Chris"
   adoRs!au_lname = "Choi"
   adoRs!contract = 1
   adoRs.Update

   adoRs.Close
   Set adoRs = Nothing
End Sub

RecordsetChangeComplete 이벤트

RecordsetChangeComplete 이벤트는 Recordset 개체가 변경된 후에 발생하며, 구문은 다음과 같다.

   RecordsetChangeComplete adReason, pError, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

adReason

EventReasonEnum 값이다. 이 이벤트를 발생시킨 원인을 나타낸다. adReason의 값은 adRsnReQuery, adRsnReSync, adRsnClose, adRsnOpen이 될 수 있다.

pError

Error 개체이다. adStatus의 값이 adStatusErrorsOccurred일 때 발생한 오류를 설명한다. 그렇지 않을 경우에는 설정되지 않는다.

adStatus

EventStatusEnum 상태값이다. 이 매개변수는 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다.RecordsetChangeComplete가 어떤 값을 반환하기 전에 이 매개변수를 adStatusUnwantedEvent로 설정하여 계속되는 통지(Notification)를 막을 수 있다.

pRecordset

이 이벤트가 발생한 Recordset 개체를 나타낸다.

Requery Open 같은 Recordset 개체의 작업으로 인해 RecordsetChangeComplete 이벤트가 발생할 수 있다.

Provider Bookmark를 지원하지 않는 경우 Provider에서 새 행이 검색될 때마다 RecordsetChange 이벤트 통지(Notification)이 발생한다. 이 이벤트가 발생하는 빈도는 RecordsetCacheSize 속성에 따라 결정된다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블을 Recordset 개체로 생성하고, Update 메서드를 사용해서 RecordsetChangeComplete 이벤트를 발생시키는 예이다.

Private Sub adoRs_RecordsetChangeComplete( _
      ByVal adReason As ADODB.EventReasonEnum, _
      ByVal pError As ADODB.Error, _
      adStatus As ADODB.EventStatusEnum, _
      ByVal pRecordset As ADODB.Recordset)

   MsgBox "RecordsetChangeComplete"
End Sub

Private Sub cmdRecordsetChangeComplete_Click()
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"

   Set adoRs = New ADODB.Recordset

   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", strConn, , , adCmdTable

   adoRs!au_fname = "Chris"
   adoRs.Update

   adoRs.Close
   Set adoRs = Nothing
End Sub

WillChangeField 이벤트

WillChangeField 이벤트는 보류 중인 작업이 Recordset 개체에 있는 하나 이상의 Field 개체 값을 변경하기 전에 발생하며, 구문은 다음과 같다.

   WillChangeField cFields, Fields, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

cFields

Fields 컬렉션에 있는 Field 개체의 개수를 나타내며, 데이터 형식은 Long이다.

Fields

보류 중인 변경 내용을 가진 Field 개체를 포함하는 Variant 배열이다.

adStatus

EventStatusEnum 상태값이다. 이 매개변수는 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고, 이 메서드가 보류 중인 작업의 취소를 요청할 수 없으면 adStatusCantDeny로 설정된다.WillChangeField가 어떤 값을 반환하기 전에 이 매개변수를 adStatusCancel로 설정하여 보류 중인 작업의 취소를 요청할 수 있다.

pRecordset

이 이벤트가 발생한 Recordset 개체를 나타낸다.

Recordset 개체의 Value 및 필드와 값 배열 매개변수를 가진 Update 작업으로 인해 WillChangeField 이벤트가 발생할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블을 Recordset 개체로 생성하고, AddNew 메서드를 사용해서 새로운 레코드를 추가할 때 필드의 값이 변경되기 전에 WillChangeField 이벤트가 발생하는 예이다.

Private Sub adoRs_WillChangeField( _
      ByVal cFields As Long, ByVal Fields As Variant, _
      adStatus As ADODB.EventStatusEnum, _
      ByVal pRecordset As ADODB.Recordset)

   MsgBox "WillChangeField"
End Sub

Private Sub cmdWillChangeField_Click()
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"

   Set adoRs = New ADODB.Recordset

   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", strConn, , , adCmdTable

   adoRs.AddNew
   adoRs!au_id = "999-99-9997"
   adoRs!au_fname = "Chris"
   adoRs!au_lname = "Choi"
   adoRs!contract = 1
   adoRs.Update

   adoRs.Close
   Set adoRs = Nothing
End Sub

WillChangeRecord 이벤트

WillChangeRecord 이벤트는 Recordset 개체에서 하나 이상의 레코드가 변경되기 전에 발생하며, 구문은 다음과 같다.

   WillChangeRecord adReason, cRecords, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

adReason

EventReasonEnum 값이다. 이 이벤트를 발생시킨 원인을 나타낸다. adReason의 값은 adRsnAddNew, adRsnDelete, adRsnUpdate, adRsnUndoUpdate, adRsnUndoAddNew, adRsnUndoDelete, adRsnFirstChange가 될 수 있다.

cRecords

영향을 받은 레코드의 수를 나타내며, 데이터 형식은 Long이다.

adStatus

EventStatusEnum 상태값이다. 이 매개변수는 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고, 이 메서드가 보류 중인 작업의 취소를 요청할 수 없으면 adStatusCantDeny로 설정된다.WillChangeRecord가 어떤 값을 반환하기 전에 이 매개변수를 adStatusCancel로 설정하여 이 이벤트를 발생시킨 작업의 취소를 요청할 수 있다.

pRecordset

이 이벤트가 발생한 Recordset 개체를 나타낸다.

Update, Delete, CancelUpdate, AddNew, UpdateBatch CancelBatch와 같은 Recordset 개체의 작업으로 인해 행에서 처음으로 변경된 필드에 대해 WillChangeRecord 이벤트가 발생할 수 있다. Recordset 개체의 CursorType은 이벤트를 발생시킨 원인을 한다.

WillChangeRecord 이벤트 중에는 Recordset 개체의 Filter 속성이 adFilterAffectedRecords로 설정된다. 이벤트를 처리하는 동안 이 속성을 변경해서는 안된다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블을 Recordset 개체로 생성하고, Update 메서드를 사용해서 WillChangeRecord 이벤트를 발생시키는 예이다.

Private Sub adoRs_WillChangeRecord( _
      ByVal adReason As ADODB.EventReasonEnum, _
      ByVal cRecords As Long, _
      adStatus As ADODB.EventStatusEnum, _
      ByVal pRecordset As ADODB.Recordset)

   MsgBox "WillChangeRecord"
End Sub

Private Sub cmdWillChangeRecord_Click()
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"

   Set adoRs = New ADODB.Recordset

   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", strConn, , , adCmdTable

   adoRs!au_id = "999-99-9997"
   adoRs!au_fname = "Chris"
   adoRs!au_lname = "Choi"
   adoRs!contract = 1
   adoRs.Update

   adoRs.Close
   Set adoRs = Nothing
End Sub

WillChangeRecordset 이벤트

WillChangeRecordset 이벤트는 보류 중인 작업이 Recordset 개체를 변경하기 전에 발생하며, 구문은 다음과 같다.

   WillChangeRecordset adReason, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

adReason

EventReasonEnum 값이다. 이 이벤트를 발생시킨 원인을 나타낸다. adReason의 값은 adRsnReQuery, adRsnReSync, adRsnClose, adRsnOpen이 될 수 있다.

adStatus

EventStatusEnum 상태값이다. 이 매개변수는 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고, 이 메서드가 보류 중인 작업의 취소를 요청할 수 없으면 adStatusCantDeny로 설정된다.WillChangeRecordset이 어떤 값을 반환하기 전에 이 매개변수를 adStatusCancel로 설정하여 보류 중인 작업의 취소를 요청할 수 있다.

pRecordset

이 이벤트가 발생한 Recordset 개체를 나타낸다.

Requery Open 같은 Recordset 개체의 작업으로 인해 WillChangeRecordset 이벤트가 발생할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Authors 테이블을 Recordset 개체로 생성하고, Update 메서드를 사용해서 WillChangeRecordset 이벤트를 발생시키는 예이다.

Private Sub adoRs_WillChangeRecordset( _
      ByVal adReason As ADODB.EventReasonEnum, _
      adStatus As ADODB.EventStatusEnum, _
      ByVal pRecordset As ADODB.Recordset)

   MsgBox "WillChangeRecordset"
End Sub

Private Sub cmdWillChangeRecordset_Click()
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"

   Set adoRs = New ADODB.Recordset

   adoRs.CursorType = adOpenKeyset
   adoRs.LockType = adLockOptimistic
   adoRs.Open "Authors", strConn, , , adCmdTable

   adoRs!au_fname = "Chris"
   adoRs.Update

   adoRs.Close
   Set adoRs = Nothing
End Sub

WillMove 이벤트

WillMove 이벤트는 보류 중인 작업이 Recordset 개체에서 현재 위치를 변경하기 전에 발생하면, 구문은 다음과 같다.

   WillMove adReason, adStatus, pRecordset

매개변수는 다음과 같다.

매개변수

설명

adReason

EventReasonEnum 값이다. 이 이벤트를 발생시킨 원인을 나타낸다. adReason의 값은 adRsnMoveFirst, adRsnMoveLast, adRsnMoveNext, adRsnMovePrevious, adRsnMove, adRsnRequery가 될 수 있다.

adStatus

EventStatusEnum 상태값이다. 이 매개변수는 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고, 이 메서드가 보류 중인 작업의 취소를 요청할 수 없으면 adStatusCantDeny로 설정된다.WillMove가 어떤 값을 반환하기 전에 이 매개변수를 adStatusCancel로 설정하여 보류 중인 작업의 취소를 요청할 수 있다

pRecordset

이 이벤트가 발생한 Recordset 개체를 나타낸다.

이 이벤트는 Open, Move, MoveFirst, MoveLast, MoveNext, MovePrevious, Bookmark, AddNew Resync와 같은 Recordset 개체의 작업으로 인해 발생할 수 있으며, Filter, Index, AbsolutePage AbsolutePosition 속성으로 인해 발생할 수도 있다.

또한, 하위 Recordset 개체에 연결된 Recordset 이벤트가 있고 상위 Recordset 개체가 이동한 경우에도 이 이벤트는 발생할 수 있다.

[예제]

다음 예제는 Pubs 데이터베이스의 Employee 테이블을 Recordset 개체로 생성하고, Move 메서드를 사용해서 WillMove 이벤트를 발생시키는 예이다.

Private Sub adoRs_WillMove( _
      ByVal adReason As ADODB.EventReasonEnum, _
      adStatus As ADODB.EventStatusEnum, _
      ByVal pRecordset As ADODB.Recordset)

   MsgBox "WillMove"
End Sub

Private Sub cmdWillMove_Click()
   Dim strConn As String

   strConn = "Provider=sqloledb;" & _
         "Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=; "

   Set adoRs = New ADODB.Recordset
   adoRs.Open "SELECT fName, lName, hire_date " & _
         "FROM Employee ORDER BY lName", strConn, , , adCmdText

   adoRs.Move 10

   adoRs.Close
   Set adoRs = Nothing
End Sub

관련글 더보기