Web/ASP & ASP.NET2009. 4. 9. 22:24

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

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=;"
  doCn.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 삽입이나 삭제와 같은 작업을 방지하기 위해서 이 이벤트를 응용할 수 있다.
Posted by Huikyun