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

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

Save 메서드

Save 메서드는 파일로 Recordset 개체를 저장하며, 구문은 다음과 같다.


   Recordset.Save FileName, PersistFormat


매개변수는 다음과 같다.


매개변수 설명
FileName 선택사항, Recordset 개체가 저장될 파일의 완전한 경로 이름
PersistFormat 선택사항, Recordset 개체가 저장될 형식을 지정하는 PersistFormatEnum 값이다.


매개변수 PersistFormat은 다음 상수 중 하나가 될 수 있다.


상수 설명
adPersistADTG 0 기본값, 전용 Advanced Data TableGram 형식으로 저장한다.
adPersistXML 1 XML 형식으로 저정한다.


Save 메서드는 열린 Recordset 개체에서만 호출할 수 있다. 저장된 Recordset 개체는 나중에 Open 메서드를 사용해서 복원할 수 있다.

Recordset 개체에 Filter 속성이 적용되면 필터링된 상태에서 접근할 수 있는 행만 저장된다. Recordset 개체가 계층 구조이면 하위 Recordset 개체를 포함해서 현재 Recordset 개체가 저장되며 상위 Recordset 개체는 저장되지 않는다.

Recordset 개체를 처음으로 저장할 때 FileName을 지정하며, 다음에 Save 메서드를 호출할 때는 FileName을 생략해야 한다. 그렇지 않으면 런타임 오류가 발생한다. 다음 번에 새로운 FileName으로 Save 메서드를 호출하면 Recordset 개체는 새로운 파일에 저장된다.

Save 메서드를 호출해도 Recordset 개체나 FileName이 닫히지는 않으므로 Recordset 개체를 사용해서 작업을 계속할 수 있으며, 가장 최근의 변경 사항을 저장할 수도 있다. FileName은 Recordset 개체를 닫을 때까지 계속 열려 있으며, 다른 응용 프로그램이 FileName의 데이터를 읽을 수는 있지만, FileName에 쓸 수는 없다.

보안상의 이유로 Microsoft Internet Explorer에서 실행되는 스크립트에서 Save 메서드에 "낮음" 보안 설정과 "사용자 정의" 보안 설정만 사용할 수 있다.

비동기 Recordset 가져오기, 실행 또는 업데이트가 진행되는 동안 Save 메서드를 호출하면 비동기 작업이 완료될 때까지 Save 메서드는 대기 상태에 있는다.

Save 메서드를 완료하면 현재 행 위치는 Recordset 개체의 첫째 행이 된다.
최상의 결과를 얻기 위해 Save 메서드에 CursorLocaion 속성을 adUseClient로 설정한다. Provider가 Recordset 개체를 저장하는데 필요한 모든 기능을 지원하지 않으면 클라이언트 커서가 해당 기능을 제공한다.

[예제]
다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체를 생성하고, Save 메서드를 사용하여 Recordset 개체를 물리적인 파일로 저장하는 예이다.

Private Sub cmdSave_Click()
  Dim adoCn As ADODB.Connection
  Dim adoRs As ADODB.Recordset
  Dim strConn As String

  Set adoCn = New ADODB.Connection
  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
  adoCn.Open strConn

  Set adoRs = New ADODB.Recordset
  adoRs.CursorType = adOpenKeyset
  adoRs.LockType = adLockOptimistic
  adoRs.Open "Authors", adoCn, , , adCmdTable

  adoRs.Save "c:\temp\authors.dat", adPersistXML

  adoRs.Close
  Set adoRs = Nothing

  adoCn.Close
  Set adoCn = Nothing
End Sub


Seek 메서드

Seek 메서드는 Recordset 개체의 인덱스를 검색하여 지정한 값과 일치하는 행을 찾고 현재 행의 위치를 해당 행으로 변경하며, 구문은 다음과 같다.


   Recordset.Seek KeyValues, SeekOptions


매개변수는 다음과 같다.


매개변수 설명
KeyValues 하나 이상의 열로 구성된 인덱스이거나 해당하는 각 열에 대하여 비교 대상이 될 값이 들어 있는 배열이며, Variant 값들의 배열이다.
SeekOptions 인덱스 열과 해당 KeyValues 사이의 비교 방법을 지정하며, 데이터 형식은 SeekEnum 값이다.


매개변수 SeekOptions는 다음의 비교 상수를 사용할 수 있다.


상수 설명
adSeekAfterEQ KeyValues와 일치한 바로 뒤의 키나 동일한 키를 찾는다.
adSeekAfter KeyValues와 일치한 바로 뒤의 키를 찾는다.
adSeekBeforeEQ KeyValues와 일치한 바로 앞의 키나 동일한 키를 찾는다.
adSeekBefore KeyValues와 일치한 바로 앞의 키를 찾는다.
adSeekFirstEQ KeyValues와 동일한 첫 키를 찾는다.
adSeekLastEQ KeyValues와 동일한 마지막 키를 찾는다.


기본 Provider가 Recordset 개체에 대하여 인덱스를 지원할 때 Seek 메서드를 Index 속성과 함께 사용한다. 기본 Provider가 인덱스를 지원하는지를 알아보려면 Support(adIndex) 메서드를 사용한다.

Seek 메서드는 원하는 행을 찾을 수 없어도 오류를 발생시키지 않고 행을 파일 끝(EOF)로 위치시킨다. 이 메서드를 실행하기 전에 Index 속성을 원하는 인덱스에 지정한다.

이 메서드는 Recordset 개체의 CursorLocation 속성이 adUseClient가 아닌 값을 가질 때만 사용할 수 있다.

[예제]
다음 예제는 NWIND.MDB의 Employees 테이블에 대한 Recordset 개체를 생성하고, Seek 메서드를 사용하여 특정 EmployeeID를 검색하는 예이다.

Private Sub cmdSeek_Click()
  Dim adoRs As ADODB.Recordset
  Dim strID As String

  Set adoRs = New ADODB.Recordset
  adoRs.CursorLocation = adUseServer
  adoRs.Open "employees", _
    "Provider=Microsoft.Jet.OLEDB.4.0;" & _
    "Data Source=nwind.mdb;" & _
    "user id=admin;password=;", _
    adOpenKeyset, adLockReadOnly, adCmdTableDirect

  If adoRs.Supports(adIndex) And adoRs.Supports(adSeek) Then
    adoRs.Index = "EmployeeId"

    adoRs.MoveFirst

    Do
      strID = LCase(Trim(InputBox("Enter an EmployeeID (e.g., 1 to 9)", "Seek Example")))
      If Len(strID) = 0 Then Exit Do
        If Len(strID) = 1 And strID >= "1" And strID <= "9" Then
          adoRs.Seek Array(strID), adSeekAfterEQ

          If adoRs.EOF Then
            Debug.Print "Employee not found."
          Else
            Debug.Print strID; ": Employee='"; adoRs!firstname; " "; adoRs!LastName; "'"
        End If
      End If
    Loop
  End If

  adoRs.Close
  Set adoRs = Nothing
End Sub


Supports 메서드

Supports 메서드는 Recordset 개체가 특정 기능을 지원하는 지의 여부를 결정하며, 구문은 다음과 같다.


   Boolean = Recordset.Supports(CursorOptions)


반환값은 CursorOptions 인수에 지정된 모든 기능을 지원하는 지의 여부를 나타내는 Boolean 값을 반환한다.

매개변수 CursorOptions는 다음과 같은 CursorOptionEnum 값이 하나 이상 포함되어 구성된 Long 식이다.


매개변수 설명
adAddNew AddNew 메서드를 사용하여 새 레코드를 추가할 수 있다.
adApproxPosition AbsolutePosition과 AbsolutePage 속성을 읽고 설정할 수 있다.
adBookmark Bookmark 속성을 사용하여 특정 레코드를 접근할 수 있다.
adDelete Delete 메서드를 사용하여 레코드를 삭제할 수 있다.
adHoldRecords 보류 중인 모든 변경 내용을 Commit하지 않고도 더 많은 레코드를 검색하거나 다음 검색 위치를 변경할 수 있다.
adMovePrevious Bookmark 없이 MoveFirst, MovePrevious 메서드, Move 또는 GetRows 메서드를 사용하여 현재 레코드 위치를 뒤로 이동할 수 있다.
adResync Resync 메서드를 사용하여 커서를 기본 데이터베이스에서 볼 수 있는 데이터로 갱신할 수 있다.
adUpdate Update 메서드를 사용하여 기본 데이터를 수정할 수 있다.
adUpdateBatch 일괄 업데이트(UpdateBatch 및 CancelBatch 메서드)를 사용하여 Provider에게 변경 그룹을 전송할 수 있다.
adIndex Index 속성을 사용하여 인덱스의 이름을 지정할 수 있다.
adSeek Seek 메서드를 사용하여 Recordset 개체에서 행을 찾을 수 있다.


Supports 메서드를 사용하여 어떤 종류의 기능을 Recordset 개체가 지원하는지 결정할 수 있다. Recordset 개체가 CursorOptions에 있는 상수에 해당하는 기능을 지원할 경우 Supports 메서드는 True를 반환한다. 그렇지 않을 경우에는 False를 반환한다.

Supports 메서드가 주어진 기능에 대해 True를 반환할지라도 Provider가 모든 상황에서 그 기능을 지원한다고 볼 수는 없다. Supports 메서드는 모든 조건이 갖추어졌다고 가정한 상태에서 Provider가 지정된 기능을 지원하는지의 여부를 반환한다. 예를 들어, 커서가 다중 테이블 조인을 기초로 하고 있어서 일부 열을 업데이트할 수 없음에도 불구하고 Supports 메서드는 Recordset 개체가 업데이트를 지원한다고 응답하는 경우가 있을 수 있다.

[예제]
다음 예제는 Pubs 데이터베이스의 Authors 테이블에 대한 Recordset 개체를 생성하고, Supports 메서드를 사용하여 Recordset 개체의 특성을 검색하는 예이다.

Private Sub cmdSupports_Click()
  Dim adoCn As ADODB.Connection
  Dim adoRs As ADODB.Recordset
  Dim strConn As String

  Set adoCn = New ADODB.Connection
  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=pubs;User Id=sa;Password=;"
  adoCn.Open strConn

  Set adoRs = New ADODB.Recordset
  adoRs.CursorType = adOpenKeyset
  adoRs.LockType = adLockOptimistic
  adoRs.Open "Authors", adoCn, , , adCmdTable

  Debug.Print "AddNew : " & adoRs.Supports(adAddNew)
  Debug.Print "adApproxPosition : " & adoRs.Supports(adApproxPosition)
  Debug.Print "adResync : " & adoRs.Supports(adResync)
  Debug.Print "adUpdate : " & adoRs.Supports(adUpdate)

  adoRs.Close
  Set adoRs = Nothing

  adoCn.Close
  Set adoCn = Nothing
End Sub


Update 메서드

Update 메서드는 Recordset 개체의 현재 레코드에 대한 변경 내용을 저장하며, 구문은 다음과 같다.


   Recordset.Update Fields, Values


매개변수는 다음과 같다.


매개변수 설명
Fields 선택사항, 단일 이름을 나타내는 Variant 또는 필드의 이름들이나 순서 위치들 또는 수정할 필드들을 나타내는 Variant 배열이다.
Values 선택사항, 단일 값을 나타내는 Variant 또는 필드의 값들 또는 새 레코드에 있는 필드들을 나타내는 Variant 배열이다.


AddNew 메서드를 호출한 이후 또는 기존 레코드에 있는 필드값을 변경한 이후에 Recordset 개체의 현재 레코드에서 변경한 내용이 있을 경우 Update 메서드를 사용하여 저장한다. Recordset 개체는 반드시 업데이트를 지원해야 한다.

필드값을 설정하려면 다음 중 하나를 수행한다.
   - Field 개체의 Value 속성에 값을 지정하고 Update 메서드를 호출한다.
   - Update 메서드를 호출할 때 필드 이름과 값을 인수로 사용하여 전달한다.
   - Update 메서드를 호출할 때 필드 이름 배열과 값 배열을 전달한다.

필드와 값으로 이루어진 배열을 사용할 경우 양쪽 배열에는 같은 수의 요소가 있어야 한다. 또한 필드 이름 순서가 필드 값의 순서와 일치해야 한다. 필드와 값에 대한 개수와 순서가 일치하지 않으면 오류가 발생한다.

Recordset 개체가 일괄 업데이트를 지원하면 UpdateBatch 메서드를 호출하기 전까지 하나 이상의 레코드의 여러 변경 내용을 로컬에 캐싱할 수 있다. UpdateBatch 메서드를 호출할 때 현재 레코드를 편집하거나 새 레코드를 추가하면 ADO는 일괄 변경 내용을 Provider에게 전송하기 전에 자동으로 Update 메서드를 호출하여 보류 중인 변경 내용을 현재 레코드에 저장한다.

Update 메서드를 호출하기 전에 추가하거나 편집하고 있는 레코드로부터 이동하면 ADO는 자동으로 Update 메서드를 호출하여 변경 내용을 저장한다. 현재 레코드의 변경 내용을 취소하거나 새로 추가된 레코드를 삭제하려면 CancelUpdate 메서드를 호출한다.

현재 레코드는 Update 메서드를 호출한 후에도 현재 레코드로 남아 있는다.

사용예는 AddNew 메서드의 예제를 참조한다.


UpdateBatch 메서드

UpdateBatch 메서드는 보류 중인 모든 일괄 업데이트 내용을 디스크에 기록하며, 구문은 다음과 같다.


   Recordset.UpdateBAtch AffectRecords


매개변수 AffectRecords는 UpdateBatch 메서드의 영향을 받을 레코드 수를 결정하는 AffectEnum 값이며, 이 매개변수는 다음 상수들 중 하나가 될 수 있다.


상수 설명
adAffectCurrent 보류 중인 변경 내용 중 현재 레코드에 대한 내용만 기록한다.
adAffectGroup 보류 중인 변경 내용 중 현재 Filter 속성값을 만족하는 레코드에 대한 내용만 기록한다. 이 옵션을 사용하려면 Filter 속성을 미리 정의된 유효한 상수로 설정해야 한다.
adAffectAll 기본값, 현재 Filter 속성 설정값에 의해 숨겨져 있는 레코드를 포함하여 Recordset 개체의 모든 레코드에 대한 보류 중인 변경 내용을 기록한다.
adAffectAllChapters 모든 Chapter에 대한 보류 중인 변경 사항을 기록한다.


일괄 업데이트 모드에서 Recordset 개체를 수정할 때 UpdateBatch 메서드를 사용하여 Recordset 개체에 대한 모든 변경 내용을 기본 데이터베이스로 전송할 수 있다.

Recordset 개체가 일괄 업데이트를 지원할 경우 UpdateBatch 메서드를 호출하기 전까지 하나 이상의 레코드에 대해 수행된 다수의 변경 내용을 지역적으로 임시 저장한다. 이 메서드를 호출한 때 현재 레코드를 편집하거나 새 레코드를 추가하는 경우, ADO는 일괄 변경 내용을 Provider에게 전송하기 전에 자동으로 Update 메서드를 호출하여 보류 중인 변경 내용을 현재 레코드에 저장한다.

일괄 업데이트는 반드시 Keyset 또는 Static 커서와 함께 사용해야 한다.

기본 데이터와 충돌하여 임의의 레코드나 모든 레코드의 변경 내용을 전송하는데 실패하면(예, 다른 사용자가 이미 레코드를 삭제한 경우) Provider는 Errors 컬렉션에 경고를 반환하고 런타임 오류가 발생한다. Filter 속성(adFilterAffectedRecords)과 Status 속성을 사용하여 충돌하는 레코드를 찾을 수 있다.

보류 중인 모든 일괄 업데이트를 취소하려면 CancelBatch 메서드를 사용한다.

[예제]
다음 예제는 Pubs 데이터베이스의 Titles 테이블에 대한 Recordset 개체를 생성하고, UpdateBatch 메서드를 사용하여 일괄 업데이트하는 예이다.

Private Sub cmdUpdateBatch_Click()
  Dim adoRs As ADODB.Recordset
  Dim strConn As String
  Dim strTitle As String
  Dim strMessage 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 = adLockBatchOptimistic
  adoRs.Open "titles", strConn, , , adCmdTable

  adoRs.MoveFirst

  Do Until adoRs.EOF
    If Trim(adoRs!Type) = "psychology" Then
      adoRs!Type = "self_help"
    End If

    adoRs.MoveNext
  Loop

  adoRs.UpdateBatch

  adoRs.MoveFirst
  Do Until adoRs.EOF
    Debug.Print adoRs!Type

    adoRs.MoveNext
  Loop

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