Web/ASP & ASP.NET2009. 4. 10. 00:25

< 출처 : 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 개체를 사용해서 검색하는 예이다.

01.<font size="2">Private Sub cmdBofEof_Click()
02.  Dim adoRs As New ADODB.Recordset
03.  Dim strConn As String
04.  Dim strMessage As String
05.  Dim intCommand As Integer
06.  Dim varBookmark As Variant
07. 
08.  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "
09.  adoRs.CursorType = adOpenStatic
10. 
11.  'AbsolutePosition 프로퍼티를 사용하기 위해서 클라이언트 CursorLocaiton을 지정한다.
12.  adoRs.CursorLocation = adUseClient
13.  adoRs.Open "SELECT pub_id, pub_name FROM publishers ORDER BY pub_name", strConn, , , adCmdText
14.  adoRs.MoveFirst
15. 
16.  Do While True
17.    strMessage = "Publisher : " & adoRs!pub_name & _
18.      vbCr & "(" & adoRs.RecordCount & "개 중 " & _
19.      adoRs.AbsolutePosition & " 번째 레코드)" & vbCr & vbCr & _
20.      "명령어를 입력하세요:" & vbCr & _
21.      "[1 - 다음(next) / 2 - 이전(previous) /" & vbCr & _
22.      "3 - bookmark 저장 / 4 - bookmark로 이동]"
23. 
24.    intCommand = Val(InputBox(strMessage))
25. 
26.    Select Case intCommand
27.      Case 1
28.        adoRs.MoveNext
29. 
30.        If adoRs.EOF Then
31.          MsgBox "마지막 레코드 입니다." & vbCr & "다시 시도하세요"
32.          adoRs.MoveLast
33.        End If
34.      Case 2
35.        adoRs.MovePrevious
36. 
37.        If adoRs.BOF Then
38.          MsgBox "처음 레코드 입니다." & vbCr & "다시 시도하세요"
39.          adoRs.MoveFirst
40.        End If
41.      Case 3
42.        varBookmark = adoRs.Bookmark
43.      Case 4
44.        If IsEmpty(varBookmark) Then
45.          MsgBox "저장된 Bookmark가 없습니다.!"
46.        Else
47.          adoRs.Bookmark = varBookmark
48.        End If
49.      Case Else
50.        Exit Do
51.    End Select
52.  Loop
53. 
54.  adoRs.Close
55.  Set adoRs = Nothing
56.End Sub
57.</font>


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 속성의 값을 읽고 쓰는 예이다.
01.Private Sub cmdBookmark_Click()
02.  Dim adoRs As New ADODB.Recordset
03.  Dim adoRs2 As New ADODB.Recordset
04.  Dim strConn As String
05.  Dim varBookmark As Variant
06. 
07.  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=;"
08. 
09.  adoRs.CursorType = adOpenStatic
10.  adoRs.CursorLocation = adUseClient
11. 
12.  adoRs.Open "SELECT pub_id, pub_name FROM publishers ORDER BY pub_name", strConn, , , adCmdText
13. 
14.  Set adoRs2 = adoRs.Clone
15. 
16.  adoRs.MoveLast
17.  adoRs.MovePrevious
18.  varBookmark = adoRs.Bookmark
19.  Debug.Print adoRs!pub_name
20. 
21.  adoRs2.Bookmark = varBookmark
22.  Debug.Print adoRs!pub_name
23. 
24.  adoRs.Close
25.  Set adoRs = Nothing
26.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일 경우에 전체 레코드의 필드를 읽는 속도의 차이를 보여주는 예이다.
01.Public Sub cmdCacheSize_Click()
02.  Dim adoRs As New Recordset
03.  Dim strConn As String
04.  Dim sngStart As Single
05.  Dim sngEnd As Single
06.  Dim sngNoCache As Single
07.  Dim sngCache As Single
08.  Dim strTemp As String
09. 
10.  strConn = "Provider=sqloledb;Data Source=Chris;Initial Catalog=pubs;User Id=sa;Password=; "
11.  adoRs.Open "roysched", strConn, , , adCmdTable
12. 
13.  sngStart = Timer
14. 
15.  adoRs.MoveFirst
16. 
17.  Do While Not adoRs.EOF
18.    strTemp = adoRs!Title_Id
19. 
20.    adoRs.MoveNext
21.  Loop
22. 
23.  sngEnd = Timer
24.  sngNoCache = sngEnd - sngStart
25. 
26.  adoRs.MoveFirst
27.  adoRs.CacheSize = 30
28.  sngStart = Timer
29. 
30.  adoRs.MoveFirst
31. 
32.  Do While Not adoRs.EOF
33.    strTemp = adoRs!Title_Id
34. 
35.    adoRs.MoveNext
36.  Loop
37. 
38.  sngEnd = Timer
39.  sngCache = sngEnd - sngStart
40. 
41.  MsgBox "성능 결과: " & vbCr & _
42.    " CacheSize 디폴트 1 (No cache): " & _
43.    Format(sngNoCache, "##0.000") & " 초" & vbCr & _
44.    " CacheSize 30 (30-record cache): " & _
45.    Format(sngCache, "##0.000") & " 초"
46. 
47.  adoRs.Close
48.  Set adoRs = Nothing
49.End Sub
Posted by Huikyun