5.1. ADO에 대한 모든 것 - RecordSet : Recordset 개체의 속성 - (2)
< 출처 : korea.internet.com, 지은이 : 최현진 >
BOF, EOF 속성
BOF 속성은 현재 레코드의 위치가 Recordset 개체의 처음 레코드의 이전에 위치했을 때 True(-1) 값을 가지며, 그 외의 경우에는 False(0) 값을 가진다.
EOF 속성은 현재 레코드의 위치가 Recordset 개체의 마지막 레코드의 다음에 위치했을 때 True(-1) 값을 가지며, 그 외의 경우에는 False(0) 값을 가진다.
만약에 BOF와 EOF 속성이 모두 True이면, 현재의 Recordset 개체에는 레코드가 하나도 없음을 나타낸다.
Recordset 개체를 생성했을 때 레코드가 하나라도 있다면 BOF와 EOF 속성은 False 이다.
만약 레코드가 하나 밖에 없을 경우에 그 마지막 레코드를 삭제한다며, BOF와 EOF 속성은 여전히 False 값을 가지며, 다른 레코드로 이동하려고 시도할 때 True로 바뀌게 된다.
만약 Recordset 개체에 레코드가 하나도 없다면 RecordCount 속성이 0이 된다.
다음의 테이블은 BOF와 EOF 속성의 조합에 따라 Move 메서드의 결과가 달라짐을 보여준다.
MoveFirst,MoveLast | MovePrevious,Move <0 | Move 0 | MoveNext,Move > 0 | |
BOF=True,EOF=False | 가능 | 오류 | 오류 | 가능 |
BOF=False,EOF=True | 가능 | 가능 | 오류 | 오류 |
모두 True | 오류 | 오류 | 오류 | 오류 |
모두 False | 가능 | 가능 | 가능 | 가능 |
[예제]
다음 예제는 Pubs 데이터베이스의 publishers 테이블의 데이터를 Recordset 개체를 사용해서 검색하는 예이다.
Private Sub cmdBofEof_Click()
Dim adoRs As New ADODB.Recordset
Dim strConn As String
Dim strMessage As String
Dim intCommand As Integer
Dim varBookmark As Variant
strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "
adoRs.CursorType = adOpenStatic
'AbsolutePosition 프로퍼티를 사용하기 위해서 클라이언트 CursorLocaiton을 지정한다.
adoRs.CursorLocation = adUseClient
adoRs.Open "SELECT pub_id, pub_name FROM publishers ORDER BY pub_name", strConn, , , adCmdText
adoRs.MoveFirst
Do While True
strMessage = "Publisher : " & adoRs!pub_name & _
vbCr & "(" & adoRs.RecordCount & "개 중 " & _
adoRs.AbsolutePosition & " 번째 레코드)" & vbCr & vbCr & _
"명령어를 입력하세요:" & vbCr & _
"[1 - 다음(next) / 2 - 이전(previous) /" & vbCr & _
"3 - bookmark 저장 / 4 - bookmark로 이동]"
intCommand = Val(InputBox(strMessage))
Select Case intCommand
Case 1
adoRs.MoveNext
If adoRs.EOF Then
MsgBox "마지막 레코드 입니다." & vbCr & "다시 시도하세요"
adoRs.MoveLast
End If
Case 2
adoRs.MovePrevious
If adoRs.BOF Then
MsgBox "처음 레코드 입니다." & vbCr & "다시 시도하세요"
adoRs.MoveFirst
End If
Case 3
varBookmark = adoRs.Bookmark
Case 4
If IsEmpty(varBookmark) Then
MsgBox "저장된 Bookmark가 없습니다.!"
Else
adoRs.Bookmark = varBookmark
End If
Case Else
Exit Do
End Select
Loop
adoRs.Close
Set adoRs = Nothing
End Sub
Bookmark 속성
Bookmark 속성은 Recordset 개체의 레코드들 중에서 현재의 레코드를 식별하는 값이며, 현재 레코드의 위치를 저장하거나 특정 레코드의 위치를 지정할 때 사용되는 속성이다. DAO와 RDO에서는 Bookmark 속성의 데이터 형식이 String 이었지만, ADO에서는 Variant 이다.
Recordset 개체를 생성하면, 각각의 레코드는 유일한 Bookmark 값을 갖는다. 이 값을 변수에 저장했다가 다른 레코드로 이동한 후에 Recordset 개체의 Bookmark 속성에 이 변수의 값을 지정하면 해당 레코드의 위치로 이동하게 된다.
Bookmark 속성의 값은 사용자에게 보여지지 않으며, 동일한 레코드를 가리키는 두개의 Bookmark 값도 서로 다른 값을 갖는다.
만약 Clone 메서드를 사용해서 Recordset 개체의 복사본을 만들 경우에만, 두개의 Recordset 개체의 Bookmark 속성은 동일한 값을 갖는다. 하지만, 동일한 Source 또는 Command 개체로부터 Recordset 개체를 생성하더라도 두 Recordset 개체의 Bookmark 값은 서로 다르다.
Remote Data Service 환경에서 클라이언트 사이드 Recordset 개체를 사용할 경우에 Bookmark 속성은 사용 가능하다.
[예제]
다음 예제는 Recordset 개체의 Bookmark 속성의 값을 읽고 쓰는 예이다.
Private Sub cmdBookmark_Click()
Dim adoRs As New ADODB.Recordset
Dim adoRs2 As New ADODB.Recordset
Dim strConn As String
Dim varBookmark As Variant
strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=;"
adoRs.CursorType = adOpenStatic
adoRs.CursorLocation = adUseClient
adoRs.Open "SELECT pub_id, pub_name FROM publishers ORDER BY pub_name", strConn, , , adCmdText
Set adoRs2 = adoRs.Clone
adoRs.MoveLast
adoRs.MovePrevious
varBookmark = adoRs.Bookmark
Debug.Print adoRs!pub_name
adoRs2.Bookmark = varBookmark
Debug.Print adoRs!pub_name
adoRs.Close
Set adoRs = Nothing
End Sub
CacheSize 속성
Recordset 개체로부터 로컬 메모리로 레코드를 가져올 때 한번에 가져올 레코드의 개수를 나타낸다. CacheSize 속성은 0 보다 큰 값을 가지며, 디폴트는 1이다.
이 속성은 Provider가 로컬 메모리의 버퍼에 몇 개의 레코드를 한번에 가지고 있을지를 결정하게 된다. 만약 CacheSize 속성이 10 이라면 Recordset 개체가 생성된 후에 Provider는 로컬 메모리에 10개의 레코드를 할당하게 된다.
만약 CacheSize 속성에 설정한 값보다 생성된 Recordset 개체에 포함된 레코드의 개수가 적다면 Provider는 생성된 Recordset 개체의 전체 레코드를 로컬 메모리로 할당하게 되며 오류는 발생하지 않는다. 또한 CacheSize 속성에는 0을 설정할 수 없으며, 설정하려 한다면 오류가 발생한다.
로컬 메모리의 캐쉬에 존재하는 레코드들은 다른 사용자에 의해서 변경된 내역을 반영하지 못하며, 캐쉬 데이터를 최신의 데이터로 변경하기 위해서는 Recordset 개체의 Resync 메서드를 사용하면 된다.
[예제]
다음 예제는 Pubs 데이터베이스의 roysched 테이블의 레코드를 가져와서 CacheSize 속성의 값이 1(디폴트 값)일 경우와 30일 경우에 전체 레코드의 필드를 읽는 속도의 차이를 보여주는 예이다.
Public Sub cmdCacheSize_Click()
Dim adoRs As New Recordset
Dim strConn As String
Dim sngStart As Single
Dim sngEnd As Single
Dim sngNoCache As Single
Dim sngCache As Single
Dim strTemp As String
strConn = "Provider=sqloledb;Data Source=Chris;Initial Catalog=pubs;User Id=sa;Password=; "
adoRs.Open "roysched", strConn, , , adCmdTable
sngStart = Timer
adoRs.MoveFirst
Do While Not adoRs.EOF
strTemp = adoRs!Title_Id
adoRs.MoveNext
Loop
sngEnd = Timer
sngNoCache = sngEnd - sngStart
adoRs.MoveFirst
adoRs.CacheSize = 30
sngStart = Timer
adoRs.MoveFirst
Do While Not adoRs.EOF
strTemp = adoRs!Title_Id
adoRs.MoveNext
Loop
sngEnd = Timer
sngCache = sngEnd - sngStart
MsgBox "성능 결과: " & vbCr & _
" CacheSize 디폴트 1 (No cache): " & _
Format(sngNoCache, "##0.000") & " 초" & vbCr & _
" CacheSize 30 (30-record cache): " & _
Format(sngCache, "##0.000") & " 초"
adoRs.Close
Set adoRs = Nothing
End Sub