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

< 출처 : korea.internet.com, 지은이 : 최현진 >

Recordset 개체는 테이블 또는 명령의 실행으로 생성된 레코드의 집합이며, 한번에 한 레코드씩 읽을 수 있다.

ADO의 Recordset 개체는 DAO(Data Access Object)의 Recordset 개체와 RDO(Remote Data Object)의 rdoResultset 개체와 같은 기능을 제공하는 개체로서 이전 버전보다 보다 강력하고 다양한 기능을 제공한다.

Recordset 개체를 사용하기 위해서는 다음과 같이 선언한다.


   Dim adoRs As ADODB.Recordset
   Set adoRs = New ADODB.Recordset


Recordset 개체는 Provider로 부터 제공된 데이터를 조작하는데 사용되어지며, 레코드(Rows)와 필드(Columns)로 구성되어 있다. Recordset 개체의 메서드와 속성은 Provider에 의해서 제공되며, 특정 Provider에서는 제공되지 않는 메서드나 속성들도 있다.

ADOR.Recordset과 ADODB.Recordset은 동일한 기능을 하는 개체이며, ADODB.Recordset 개체는 ADO에 의해서 제공되어지는 것이고, ADOR.Recordset은 인터넷 익스플로러에 의해서 제공되는 개체이다.


제 1절 Recordset 개체의 속성


속성 설명 데이터 형식
AbsolutePage 현재 레코드가 위치한 페이지를 나타낸다. Long
AbsolutePosition 현재 레코드의 위치를 나타낸다. Long
ActiveCommand Recordset 개체를 생성한 Command 개체를 나타낸다. (읽기전용) Object
ActiveConnection Recordset 개체가 속한 Connection 개체를 나타낸다. Variant
BOF 현재 레코드의 위치가 Recordset 개체의 맨 처음 레코드의 이전에 있음을 나타낸다. Boolean
Bookmark 현재 레코드의 위치를 저장하거나 특정 레코드의 위치를 지정할 때 사용되는 속성 Variant
CacheSize Recordset 개체로부터 로컬 메모리로 레코드를 가져올 때 한번에 가져올 레코드의 개수를 나타낸다. Long
CursorLocation 커서 엔진의 위치를 지정한다. Long
CursorType Recordset 개체의 커서 타입을 지정한다. CursorTypeEnum
DataMember DataSource 속성이 참조하는 개체에서 검색할 데이터 구성원의 이름을 나타낸다. String
DataSource Recordset 개체로 나타낼 데이터를 포함하는 개체를 지정한다. Object
EditMode 현재 레코드의 편집 상태를 나타낸다. EditModeEnum
EOF 현재 레코드의 위치가 Recordset 개체의 맨 마지막 레코드의 다음에 있음을 나타낸다. Boolean
Fields Field의 컬렉션  
Filter Recordset 개체 내의 데이터에 대한 필터를 나타낸다. Variant
LockType Recordset 개체 내의 레코드를 편집할 동안 해당 레코드에 설정할 Lock 타입을 나타낸다. LockTypeEnum
MarchalOptions 이 속성은 서버로 다시 마샬링될 레코드를 나타낸다 Long
MaxRecords 하나의 질의에서 Recordset에 반환되는 레코드 개수의 최대값을 나타낸다. Long
PageCount Recordset 개체에 들어 있는 데이터의 페이지 수를 나타낸다. Long
PageSize Recordset에서 페이지 하나를 구성하는 레코드 수를 나타낸다. Long
Properties Properties 속성은 Properties 컬렉션을 나타내며, 이 컬렉션은 한 개체의 특정 인스턴스에 대한 모든 Property 개체들을 포함한다.(읽기 전용) Properties 컬렉션
RecordCount Recordset 개체의 현재 레코드 수를 나타낸다 Long
Sort Recordset 개체를 정렬할 하나 이상의 필드 이름을 지정하고, 각 필드를 오름차순 또는 내림차순으로 정렬할지 여부를 지정한다. String
Source Recordset 개체에 있는 데이터에 대한 원본(Command 개체, SQL 문, 테이블 이름 또는 저장 프로시저)을 나타낸다. Variant
State 사용할 수 있는 모든 개체에 대해 이들 개체의 상태가 열려 있는지 또는 닫혀 있는지 여부를 설명한다. Long
Status 일괄 업데이트 또는 기타 대량 작업과 관련된 현재 레코드의 상태를 나타낸다 Long
StayInSync 계층적 Recordset 개체에서 기본 하위 레코드 집합(예: 장)이 변경될 때 상위 행도 변경되어야 하는지를 나타낸다. Boolean



AbsolutPage 속성

AbsolutePage 속성은 현재의 레코드가 위치한 페이지를 나타내는 속성이다. 1과 PageCount 속성값 사이의 Long 형식의 값을 가지거나 아래의 상수 값을 갖는다. 읽기와 쓰기가 모두 가능하다.

AbsolutePage 속성은 다음 값 중 하나를 반환한다.


상수 설명
AdPosUnknown Recordset 개체가 Empty이어서 현재 레코드의 위치를 알 수 없을 경우, 또는 Provider가 AbsolutPosition 속성을 지원하지 않는 경우이다.
AdPosBOF 현재 레코드의 위치가 BOF인 경우, BOF 속성이 True이다.
AdPosEOF 현재 레코드의 위치가 EOF인 경우, EOF 속성이 True이다.


ADO의 Recordset 개체는 PageSize 속성에 의해서 동일한 개수의 레코드로 나누어져서 AbsolutePage를 갖는다. PageSize 속성을 사용해서 논리적으로 Recordset 개체를 일련의 페이지로 분할할 수 있다.

AbosolutPosition 속성은 레코드의 위치를 나타내는 것이며, PageCount 속성은 전체 페이지의 개수를 나타낸다.
이 속성을 사용하기 위해서 Provider가 적절한 기능을 제공해야 하며, 그렇지 못할 경우에는 -1 값을 반환한다.

[예제]
다음 예제는 생성된 Recordset 개체의 레코드를 5개 단위로 나누어서 AbsolutePage 속성을 지정하는 예이다. 여기에서 한 가지 주의할 것은 PageCount 속성을 사용하기 위해서 CursorLocation을 adUseClient로 지정해야 된다는 것이다. CursorLocation 속성을 adUseServer로 지정하면 PageCount 속성은 -1을 반환한다.

Private Sub cmdAbsolutePage_Click()
  Dim adoRs As ADODB.Recordset
  Dim strConn As String
  Dim strMsg As String
  Dim iPage As Integer
  Dim iPageCount As Integer
  Dim iRecord As Integer

  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=;"
  Set adoRs = New ADODB.Recordset

  adoRs.CursorLocation = adUseClient
  adoRs.Open "Employee", strConn, , , adCmdTable

  adoRs.PageSize = 5

  iPageCount = adoRs.PageCount

  For iPage = 1 To iPageCount
    adoRs.AbsolutePage = iPage
    strMsg = ""

    For iRecord = 1 To adoRs.PageSize
      strMsg = strMsg & adoRs!fname & " " & adoRs!lname & " " & adoRs!hire_date & vbCr

      adoRs.MoveNext

      If adoRs.EOF Then Exit For
    Next iRecord

    MsgBox strMsg
  Next iPage

  adoRs.Close
  Set adoRs = Nothing
End Sub


AbsolutePosition 속성

AbsolutePosition 속성은 Recordset 개체 내에서 현재의 레코드가 물리적으로 몇 번째에 위치하고 있는지를 나타내는 속성이다. 1에서 RecordCount 속성값 사이의 Long 타입의 값을 가지거나, 다음의 상수값을 갖는다. 그리고 읽기와 쓰기가 모두 가능하다.


상수 설명
AdPosUnknown Recordset 개체가 Empty이어서 현재 레코드의 위치를 알 수 없을 경우, 또는 Provider가 AbsolutPosition 속성을 지원하지 않는 경우
AdPosBOF 현재 레코드의 위치가 BOF인 경우, BOF 속성이 True이다.
AdPosEOF 현재 레코드의 위치가 EOF인 경우, EOF 속성이 True이다.


AbsolutePosition 속성은 특정 레코드로 이동하거나, 현재의 레코드의 위치를 알아내고자 할 때 사용된다.

AbsolutePage 속성과 동일하게 1부터 시작하며, 생성된 Recordset 개체에 포함된 레코드의 개수는 RecordCount 속성을 이용해서 알 수 있다.

AbsolutePosition 속성에 값을 지정하면, 현재의 캐쉬에 레코드가 있더라도, 새로이 지정한 위치의 레코드 그룹을 캐쉬로 읽어 들인다. 이렇게 읽어들인 그룹의 크기는 CacheSize 속성에 의해서 지정된다.

일반적으로 AbsolutePosition 속성은 특정 레코드를 기억하기 위해서 사용하는 것은 바람직하지 못하다. 이유는 현재 레코드의 AbsolutePosition 속성의 값을 읽은 다음에 Recordset 개체에 새로운 레코드가 추가되거나 삭제된다면, AbsolutePosition 속성이 기억하고 있는 레코드는 다른 레코드일 것이다. 이런 이유로 특정 레코드를 기억하기 위해서는 Bookmark 속성을 주로 사용한다.

이 속성을 사용하기 위해서 Provider가 적절한 기능을 제공해야 하며, 그렇지 못할 경우에는 -1 값을 반환한다.

[예제]
다음 예제는 Pubs 데이터베이스의 Employee 테이블의 레코드를 하나씩 메시지 박스로 보여주는 예이다.

Private Sub cmdAbsolutePosition_Click()
  Dim adoRs As New ADODB.Recordset
  Dim strConn As String
  Dim strMsg As String

  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=;"

  adoRs.CursorLocation = adUseClient
  adoRs.Open "Employee", strConn, , , adCmdTable

  Do While Not adoRs.EOF
    strMsg = "Employee: " & adoRs!lName & vbCr & _
      "(" & adoRs.RecordCount & "레코드 중 " & adoRs.AbsolutePosition & "번째)"

    If MsgBox(strMsg, vbOKCancel) = vbCancel Then Exit Do

    adoRs.MoveNext
  Loop

  adoRs.Close
  Set adoRs = Nothing
End Sub


ActiveCommand 속성

ActiveCommand 속성은 연관된 Recordset 개체를 생성한 Command 개체를 나타낸다. 이 속성은 Command 개체가 포함된 Variant를 반환하며, 기본 값은 Null 개체 참조이다.

이 속성은 읽기 전용이며, 현재 Recordset 개체를 생성할 때 Command 개체를 사용하지 않았다면 Null 개체 참조가 반환된다.

Command 개체로부터 생성된 Recordset 개체의 이 속성을 사용하면 연관된 Command 개체의 정보를 알 수 있다.

[예제]
다음 예제는 Pubs 데이터베이스의 저장 프로시정 byroyalty를 실행한 후 생성한 Recordset 개체의 ActiveCommand 속성을 보여주는 예이다.
Private Sub cmdActiveCommand_Click()
  Dim adocn As New ADODB.Connection
  Dim adoCmd As New ADODB.Command
  Dim adoPara As New ADODB.Parameter
  Dim adoRs As New ADODB.Recordset
  Dim strConn As String

  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
  adocn.Open strConn

  Set adoCmd.ActiveConnection = adocn

  adoCmd.CommandText = "byroyalty"
  adoCmd.CommandType = adCmdStoredProc
  adoCmd.CommandTimeout = 15

  adoPara.Type = adInteger
  adoPara.Direction = adParamInput
  adoPara.Value = 100
  adoCmd.Parameters.Append adoPara

  '명령을 실행해서 Recordset 개체 생성
  Set adoRs = adoCmd.Execute()

  Debug.Print "ActiveCommand : " & adoRs.ActiveCommand.CommandText

  adoRs.Close
  Set adoRs = Nothing

  Set adoCmd = Nothing

  adocn.Close
  Set adocn = Nothing
End Sub


ActiveConnection 속성

ActiveConnection 속성은 현재의 Recordset 개체가 속해 있는 Connection 개체를 나타낸다. 이 속성은 연결을 위한 정보를 문자열로 지정하거나, Connection 개체를 지정할 수 있으며, 기본값은 Null 개체이다.

ActiveConnection 속성은 Recordset 개체가 이미 생성되었거나, Recordset 개체의 Source 속성에 유효한 Command 개체가 지정되었다면 읽기 전용이며, Recordset 개체가 아직 열려지지 않았다면 읽기, 쓰기가 모두 가능하다.

Recordset 개체의 Open 메서드에서 ActiveConnection 인수를 지정하면, 그 인수의 값이 Recordset 개체의 ActiveConnection 속성으로 상속된다. 또한 Recordset 개체의 Source 속성에 유효한 Command 개체를 지정할 경우에는 Recordset 개체의 ActiveConnection 속성은 Command 개체의 ActiveConnection 속성의 값을 상속받는다.

Remote Data Service 환경에서 클라이언트 사이드 Recordset 개체를 사용할 경우 이 속성은 ConnectionString 또는 Nothing 만을 지정할 수 있다.

[예제]
다음 예제는 Pubs 데이터베이스에 접속하는 예이다.
Private Sub cmdActiveConnection_Click()
  Dim adoCn As New ADODB.Connection
  Dim adoRs As New ADODB.Recordset
  Dim strConn As String

  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=;"
  adoCn.Open strConn

  adoRs.Open "Authors", adoCn, , , adCmdTable

  Do While Not adoRs.EOF
    Debug.Print adoRs!au_lname

    adoRs.MoveNext
  Loop

  adoRs.Close
  Set adoRs = Nothing

  adoCn.Close
  Set adoCn = Nothing
End Sub
Posted by Huikyun