< 출처 : 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 문으로 다음과 같이 기술해야 한다.
위와 같이 코딩을 하면 비주얼 베이직의 코드 편집창에 다음 그림과 같이 이벤트에 대한 목록이 나타난다.
[그림]Connection 개체의 이벤트
Connection 개체의 이벤트를 사용하기 위해서는 WithEvents 문과 함께 adoCn 변수를 선언하게 되는데, 이 경우에는 변수를 선언할 때 New 키워드를 함께 사용할 수 없으며, Connection 개체를 사용하기 전에 Connection 개체의 새로운 인스턴스를 다음과 같은 코드로 생성해야 한다.
참고 Early Binding과 Late Binding
비주얼 베이직에서 특정 개체를 사용하려면 Object 변수에 개체를 바인딩해야하며, 바인딩 형식에 따라 Early Binding과 Late Binding으로 분류할 수 있다. |
BeginTransComplete 이벤트
BeginTransComplete 이벤트는 새로운 트랜잭션이 성공적으로 시작한 후 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.
인수 | 데이터 형식 | 설명 |
TransactionLevel | Long | 이벤트를 발생시킨 BeginTrans의 새로운 트랜잭션 레벨을 나타낸다. |
pError | ADODB.Error | 오류가 발생해서 adStatus가 adStatusErrorsOccurred 이면 발생한 오류에 대한 정보를 가지고 있는 개체이다. 그렇지 않을 경우에는 설정되지 않는다. |
adStatus | ADODB.EventStatusEnum | EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다. |
pConnection | ADODB.Connection | BeginTrans를 수행한 Connection 개체를 나타낸다. |
트랜잭션이 시작될 때, 종속적으로 수행해야 할 다른 작업이 있다면 이 이벤트를 사용해서 구현할 수 있다. 예를 들어, 트랜잭션 모니터링 도구를 만들려면 이 이벤트를 사용해서 트랜잭션 로그를 생성할 수 있을 것이다.
CommitTransComplete 이벤트
CommitTransComplete 이벤트는 트랜잭션이 성공적으로 저장된 후 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.
인수 | 데이터 형식 | 설명 |
pError | ADODB.Error | 오류가 발생해서 adStatus가 adStatusErrorsOccurred 이면 발생한 오류에 대한 정보를 가지고 있는 개체이다. 그렇지 않을 경우에는 설정되지 않는다. |
adStatus | ADODB.EventStatusEnum | EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다. |
pConnection | ADODB.Connection | CommitTrans를 수행한 Connection 개체를 나타낸다. |
트랜잭션이 성공적으로 완료되었을 때, 종속적으로 수행해야 할 다른 작업이 있다면 이 이벤트를 사용해서 구현할 수 있다.
ConnectComplete 이벤트
ConnectComplete 이벤트는 Connection 개체가 데이터 소스에 성공적으로 연결한 직후에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.
인수 | 데이터 형식 | 설명 |
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 개체의 데이터 소스와의 연결이 끊어진 직후에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.
인수 | 데이터 형식 | 설명 |
adStatus | ADODB.EventStatusEnum | EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다. |
pConnection | ADODB.Connection | 이벤트를 발생시킨 Connection 개체를 나타낸다. |
이 이벤트는 데이터 소스와의 연결이 정상적으로 끊어졌는지를 점검하기 위해서 사용할 수 있다. 예를 들어, 네트워크의 장애로 인해서 Connection 개체의 데이터 소스와의 연결이 비 정상적으로 끊어진 경우에, 이 이벤트를 사용해서 응용 프로그램 사용자에게 오류 메시지를 표시하도록 구현할 수 있다.
ExecuteComplete 이벤트
ExecuteComplete 이벤트는 실행이 완료된 직후에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.
인수 | 데이터 형식 | 설명 |
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 컬렉션에 정보 메시지가 추가될 때 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.
인수 | 데이터 형식 | 설명 |
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이 성공적으로 이루어진 후에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.
인수 | 데이터 형식 | 설명 |
pError | ADODB.Error | 오류가 발생해서 adStatus가 adStatusErrorsOccurred 이면 발생한 오류에 대한 정보를 가지고 있는 개체이다. 그렇지 않을 경우에는 설정되지 않는다. |
adStatus | ADODB.EventStatusEnum | EventStatusEnum 상태 값으로 이벤트를 발생시킨 작업이 성공하면 adStatusOK로 설정되고 작업이 실패하면 adStatusErrorsOccurred로 설정된다. |
pConnection | ADODB.Connection | RollbackTrans를 수행한 Connection 개체를 나타낸다. |
트랜잭션이 실패했을 때, 종속적으로 수행해야 할 다른 작업이 있다면 이 이벤트를 사용해서 구현할 수 있다.
예를 들어, 대량의 배치 작업을 수행할 경우에 이 이벤트를 사용해서 작업의 성공 여부를 확인할 수 있다.
WillConnect 이벤트
WillConnect 이벤트는 연결이 이루어지기 이전에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.
인수 | 데이터 형식 | 설명 |
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 이벤트는 질의가 수행되기 이전에 발생하는 이벤트이며, 다음과 같은 구문을 사용한다.
인수 | 데이터 형식 | 설명 |
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 삽입이나 삭제와 같은 작업을 방지하기 위해서 이 이벤트를 응용할 수 있다.