Web/ASP & ASP.NET2009. 4. 10. 20:04

< 출처 : 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
Posted by Huikyun