< 출처 : korea.internet.com, 지은이 : 최현진 >
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