Web/ASP & ASP.NET2009. 4. 9. 19:08

< 출처 : korea.internet.com, 지은이 : 최현진 >

개요

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 버전 정보 화면

Posted by Huikyun