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

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
Posted by Huikyun