< 출처 : 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