본문 바로가기

Window Programming/VB

ADO

ADO 객체

객체 설명
Connection 데이터 연결 설정
Command SQL 명령 구현
Parameter SQL 명령에 필요한 파라미터 설정
Recordset 데이터 탐색 및 조작
Field Recordset 객체의 필드를 구현하고 조작
Error Connection 객체의 에러 처리
Property ADO 객체 각각의 특징 구현

ADO 컬렉션

컬렉션 설명
Errors Connection 객체에 발생한 모든 에러 객체 관리
Parameters Command 객체와 관련된 모든 Parameter 객체 관리
Fields Recordset 객체와 관련된 모든 Field 객체 관리
Properties Connection, Command, Recordset, Field 객체의 Property 객체 관리

ADO를 이용한 작업 순서

1. Connection 객체와 Recordset 객체 생성

Dim CON As ADODB.Connection
Dim RS As ADODB.Recordset

Set CON = New ADODB.Connection
Set RS = New ADODB.Recordset

2. Connection 객체의 ConnectionString 속성에 연결 정보 설정

Dim str As String

str = "PROVIDER=Microsoft.Jet.OLEDB.4.0;data source=Biblio.mdb;"

3. Connection 객체의 Open 메서드를 사용하여 데이터 소스에 대한 연결 오픈

CON.ConnectionString = str

4. 오픈 된 Connection 객체를 인수로 Recordset 객체의 Open 메서드 사용

CON.Open

5. Recordset 객체를 가지고 작업

RS.Open "SELECT * FROM Titles", CON

6. 바운드 컨트롤에 Recordset 할당

For I = 0 To 4
    Set txtData(I).DataSource = RS
    txtData(I).DataField = RS.Fields(I).Name
Next I

7. 작업 완료 시 연결 정보 해제

RS.Close
CON.Close

 

Connection 객체

속성 설명
Attribute Rollback, Commit 후 새로운 트랜젝션이 시작되게 할 것인지 명시
CommandTimeout 명령이 처리되기까지의 대기시간
ConnectionString 데이터 소스 연결 정보
ConnectionTimeout 데이터 소스 연결 대기시간
DefaultDatabase 여러개의 데이터 소스 연결 정보 중 사용할 기본값
IsolationLevel 하나의 데이터 소스에 대한 다중 트랜젝션 허용 여부
CusorLocation 커서의 위치 (adUseClient, adUseServer)
Mode adModeUnknown, adModeRead, adModeWrite, adModeReadWrite
Provider 데이터 소스 제공자 설정
Version 연결에 사용된 ADO 버전
메서드 설명
BeginTrans 트랜젝션 시작
CommitTrans 처리된 트랜젝션 반영
RollbackTrans 처리된 트랜젝션 취소
Close 연결 종료
Execute 데이터 소스에 설정된 명령 수행 후 레코드 셋 반환
Open 연결 오픈
이벤트 설명
BeginTransComplete 트랜젝션 완료 시
CommitTransComplete commit 완료 시
RollbackTransComplete rollback 완료 시
WillConnect 연결이 이루어지기 직전
ConnectComplete 연결이 성공했을 때
Disconnect 연결이 종료되었을 때
WillExecute 명령 실행 직전
ExecuteComplete 명령 실행 완료 시
InfoMessage 현재 작업에 대한 추가 정보가 있을 때

 

Command 객체

독자적인 생성

Dim comm As ADODB.Command
Dim rs As ADODB.Recordset
Dim str As String

str = "PROVIDER=Microsoft.Jet.OLEDB.4.0;data source=Biblio.mdb;"

comm.ActiveConnection = str
comm.CommandText = "Select * From Titles"

rs.Open comm

Connection 객체를 통한 생성

Dim con As ADODB.Connection
Dim comm As ADODB.Command
Dim rs As ADODB.Recordset
Dim str As String

Set con = New ADODB.Connection
Set comm = New ADODB.Command
Set rs = ADODB.Recordset

str = "PROVIDER=Microsoft.Jet.OLEDB.4.0;data source=Biblio.mdb;"

con.ConnectionString = str
con.Open

comm.ActiveConnection = con
comm.CommandText = "Select * From Titles"

rs.Open comm

속성 설명
ActiveConnection 연결 문자열 또는 Connection 객체 지정
CommandText 질의, 프로시저, 테이블 지정
CommandTimeout 명령 실행 대기시간
CommandType CommandText에 지정한 명령 유형 정보를 Provider에 전달
Prepared 명령의 컴파일된 버전
Name 명령의 이름
State 상태
Parameters Parameter 객체의 컬렉션
CommandType 속성 설명
adCmdFile 파일
adCmdStoredProc 저장 프로시저
adCmdTable 테이블
adCmdTableDirect 테이블
adCmdText SQL 질의문
adCmdUnknown 알 수 없는 경우

comm.CommandText = "Select * From Titles"
comm.CommandType = adCmdText

comm.CommandText = "Titles"
comm.CommandType = adCmdTable

메서드 설명
CreateParameter 새로운 Parameter 생성
Execute CommandText에 설정된 명령 실행

command.Execute [Record Affected], [Parameters], [Options]

comm.CommandText = "Delete From Titles"
comm.Execute cnt, , dbCmdText    // Select 문은 레코드셋을 반환, 실행질의의 경우 적용된 레코드 수 반환

 

Parameter 객체 및 컬렉션

속성 설명
Attribute parameter가 받아들이는 값의 종류
adParamSigned, adParamNullable, adParamLong
Direction parameter의 사용 방향
adParamInput, adParamOutput, adParamInputOutput, adParamReturnValue
Name parameter 이름
NumericScale 이용할 소숫점 이하 자리 수
Precision 취급할 전체 자리수
Size parameter 크기
Type 데이터 타입
adBigInt, adBinary, adBoolean, adInterger, ...
Value
메서드 설명
AppendChunk Memo, Long Binary 등 큰 바이트를 parameter에 추가

질의에 Parameter 객체를 사용한 예

Dim comm As ADODB.Command
Dim rs As ADODB.Recordset
Dim param As ADODB.Parameter
Dim str As String

Private Sub Form_Load()
    Set comm = New ADODB.Command
    Set rs = New ADODB.Recordset

    str = [commection string information]
    comm.ActiveConnection = str

    Set param = comm.CreateParameter("", adBSTR, adParamInput, , "Using SQL")    ' (Name, Type, Direction, Size, Value)
    comm.Parameters.Append param

    comm.CommandText = "Select * From Titles Where Title = param"
    comm.Execute

    rs.open comm, , , , adCmdText
    Call Display
End Sub

저장 프로시저에 Parameter 객체를 사용한 예

CREATE PROCEDURE Change_Value @vParam int AS
UPDATE SampleTable SET Value = Value + @vParm

. . .
Set param = comm.CreateParameter("", adInteger, adParamInput, val(Text1.Text))
comm.Parameters.Append param

comm.CommandType = adComStoredProc
comm.CommandText = "Change_Value"

comm.Execute
rs.Open comm

 

Recordset 객체

recordset.Open [Source], [ActiveConnection], [CursorType], [LockType], [Options]

Source : 테이블, 쿼리 또는 활성화 되어 있는 Command 객체의 참조변수

ActiveConnection : 유효한 연결문자열 또는 활성화 되어 있는 Connection 객체의 참조변수

CursorType : 커서(레코드셋) 유형

LockType : 잠금 형식 (디폴트 = adLockReadOnly)

Options : 레코드셋 구성 옵션 (adCmdText, adCmdTable, 등)

Recordset 생성

연결문자열 사용

Dim rs As ADODB.Recordset
Dim str As String

Set rs = ADODB.Recordset

str = "PROVIDER=Microsoft.Jet.OLEDB.4.0;data source=Biblio.mdb;"

rs.Open "Select * From Titles", str

Connection 참조변수 사용

Dim con As ADODB.Connection
Dim rs As ADODB.Recordset
Dim str As String

Set con = New ADODB.Connection
Set rs = ADODB.Recordset

str = "PROVIDER=Microsoft.Jet.OLEDB.4.0;data source=Biblio.mdb;"

con.ConnectionString = str
con.Open

rs.Open "Select * From Titles", con

Command 참조변수 사용

Dim con As ADODB.Connection
Dim comm As ADODB.Command
Dim rs As ADODB.Recordset
Dim str As String

Set con = New ADODB.Connection
Set comm = New ADODB.Command
Set rs = ADODB.Recordset

str = "PROVIDER=Microsoft.Jet.OLEDB.4.0;data source=Biblio.mdb;"

con.ConnectionString = str
con.Open

comm.ActiveConnection = con
comm.CommandText = "Select * From Titles"

rs.Open comm

속성 설명
AbsolutePage 커런트 레코드가 위치한 페이지 설정 또는 반환
AbsolutePosition 커런트 레코드의 위치 설정 또는 반환
ActiveConnection 연결 상태 설정 또는 반환
ActiveCommand 읽기 전용 속성, 현재 Recordset 객체와 관계되는 Command 반환
BOF 레코드셋 시작
EOF 레코드셋 끝
BookMark 커런트 레코드 위치 설정 또는 반환
CacheSize client에 임시로 저장할 레코드 수
CusorLocation 커서 위치 (adUseClient, adUseServer)
CusorType 커서 유형
EditMode 커런트 레코드의 상태 (adEditadd, adEditDelete, adEditInProgress, adEditNone)
Fields (컬렉션) 레코드 내의 필드에 접근할 수 있는 컬렉션
Filter 레코드셋 구성을 위한 필터 설정
LockType 잠금 유형 (adLockBatchOptimistic, adLockOptimixtic, adLockPessimistic, adLockReadOnly)
MaxRecords 레코드셋이 반환할 레코드의 최대수
PageCount 레코드셋 내의 페이지 수
PageSize 한 페이지에 구성될 레코드 수
RecordCount 레코드셋 내의 레코드 수 (접근된 레코드 중 가장 큰 레코드 번호)
Sort 특정 필드를 기준으로 순서화된 레코드셋 구성
Source 레코드셋 소스
Status 레코드셋 상태
State 레코드셋 객체의 상태 (adStateClose, adStateConnection, adStateExecuting, adStateFetch, adStateOpen)
메서드 설명
AddNew 새로운 레코드 추가
CancelBatch 처지중인 batch 작업 취소
CancelUpdate 갱신 작업 취소
Clone Recordset 객체 복제
Close 레코드셋 닫기
CompareBookMarks BookMark 비교
Delete 레코드 삭제
Find 조건을 만족하는 레코드 검색
GetRows 지정한 범위의 레코드를 이차원 배열에 복사
GetString 지정 레코드를 문자 변수에 복사
Move 지정 레코드로 이동
MoveFirst, MoveLast
MovePrevious, MoveNext
레코드 이동
NextRecordset 현재 열려있는 레코드셋을 닫고, 다음 레코드셋을 연다
Open 레코드셋 열기
Requery 현재 설정되어있는 질의를 새로 실행하여 레코드셋 수정
Resync 데이터베이스와 동조
Save 레코드셋을 특정 형식으로 파일에 저장
Supports 데이터 소스에 특정 함수가 보내어질 것인지를 지정
Update 변경 상태 저장
UpdateBatch 변경 상태를 일괄적으로 갱신

Result = Recordset.CompareBookMark( BookMark1, BookMark2 ) As CompareEnum

result = adCompareLessThan, adCompareEqual, adCompareGreaterThan, adCompareNotEqual, adCompareNotComparable

Recordset2 = Recordset1.Clone([LockType])

Recordset.Find( criteria, [SkipRow], [searchDirection], [start] )

array = Recordset.GetRows( [Rows], [Start], [Fields] )

start = adBookmarkCurrent, adBookmarkFirst, adBookmarklast

string = Recordset.GetString( [StringFormat], [Rows], [ColumnDelimiter], [RowDelimiter], [NullExpr] )

recordset2 = recordset1.NextRecordset( [RecordsAffected] )

Recordset.ReQuery([Option])

Recordert.UpdateBatch

이벤트 발생 시점 원인
FetchProgress 비동기 데이터 처리가 진행되는 동안 Recordset.Open(..., adAsyncExecute)

비동기 Execute

FetchComplete 비동기 데이터 처리가 완료된 시점
WillMove 커런트 레코드의 위치가 변경되기 전 Open, Move, MoveFirst, MoveLast
MovePrevious, MoveNext, BookMark
AddNew, Delete, ReQuery, ReSync
MoveComplete 커런트 레코드의 위치가 변경된 후
EndOfRecordset EOF에 도달했을 때
WillChangeField 커런트 필드의 값이 변경되기 전 Update
FieldChangeComplete 커런트 필드의 값이 변경된 후
WillChangeRecord 커런트 레코드가 변경되기 전 Update, Delete, CancelUpdate, AddNew
UpdateBatch, CancelBatch
RecordChangeComplete 커런트 레코드 변경 완료 후
WillChangeRecordset 현재 레코드셋이 변경되기 전 ReSync, ReQuery, Close, Open 등
RecordsetChangeComplete 현재 레코드셋이 변경된 후

 

레코드셋 운영하기

Move 동작

Private Sub cmdNext_Click()
    On Error GoTo ErrRoutine

    If Not rs.EOF Then rs.MoveNext

    If rs.EOF And rs.RecordCount > 0 Then
        MsgBox "데이터의 끝!"
        rs.MoveLast
    End If

    Exit Sub
ErrRoutine:
    MsgBox err.Description
End Sub

Private Sub cmdPrevious_Click()
    On Error GoTo ErrRoutine

    If Not rs.BOF Then rs.MovePrevious

    If rs.BOF And rs.RecordCount > 0 Then
        MsgBox "데이터의 처음!"
        rs.MoveFirst
    End If

    Exit Sub
ErrRoutine:
    MsgBox err.Description
End Sub

Private Sub cmdLast_Click()
    On Error GoTo ErrRoutine

    rs.MoveLast
    Exit Sub
ErrRoutine:
    MsgBox Err.Description
End Sub

Private Sub cmdFirst_Click()
    On Error GoTo ErrRoutine

    rs.MoveFirst
    Exit Sub
ErrRoutine:
    MsgBox Err.Description
End Sub

레코드 추가, 수정 및 갱신

Dim EditFlag As Boolean
Dim AddFlag As Boolean

Private Sub txtField_KeyPress(Index As Ineteger, KeyAscii As Integer)
    If EditFlag Or AddFlag Then
        If KeyAscii = 13 Then
            KeyAscii = 0
            SendKeys = "{Tab}"
        End If
    Else
        If EdifFlag = False And AddFlag = False Then KeyAscii = 0
    End If
End Sub

Private Sub cmdEdit_Click()
    On Error GoTo ErrRoutine

    EdifFlag = True
    Call SetButtons(False)
    Exit Sub
ErrRoutine:
    MsgBox Err.Description
End Sub

Private Sub SetButtons(BFlag As Boolean)
    cmdAdd.Visible = BFlag
    cmdEdit.Visible = BFlag
    cmdUpdate.Visible = Not BFlag
    cmdCancel.Visible = Not BFlag
    cmdNext.Visible = BFlag
    cmdPrevious.Visible = BFlag
    cmdLast.Visible = BFlag
    cmdFirst.Visible = BFlag
End Sub

Private Sub cmdUpdate_Click()
    On Error GoTo ErrRoutine

    rs.UpdateBatch adAffectAll

    If AddFlag Then rs.MoveLast

    EditFlag = False
    AddFlag = False
    Call SetButtons(True)

    Exit Sub
ErrRoutine:
    MsgBox Err.Description
End Sub

Private Sub cmdDelete_Click()
    On Error GoTo ErrRoutine

    rs.Delete
    rs.MoveNext

    If rs.EOF Then rs.MoveLast

    Exit Sub
ErrRoutine:
    MsgBox Err.Description
End Sub

 

필드 객체

속성 설명
ActualSize 데이터의 실제 길이
Attribute 필드에 대해서 지원되는 기능 결정
DefineSize 필드의 최대 길이
Name 필드의 이름
NumericScale 소수점 이하의 자리수
Value 필드의 값
Precision 숫자 필드의 자리수
Type 데이터 타입
UnderLyingValue UpdateBatch 작업시, 필드가 현재 가지고 있는 값
OriginalValue UpdateBatch 작업시, 변경되기 이전의 필드값
메서드 설명
AppendChunk 긴-Binary 데이터나 문자 데이터를 필드에 추가
GetChunk 긴-Binary 데이터나 문자 데이터를 필드에서 읽어 옴
컬렉션 속성 설명
Count 컬렉션 내의 필드 수
Item 컬렉션 내의 특정 필드

tit = rs.Fields(0).Value

tit = rs.Fields("Title").Value

tit = rs.Fields("Title")    // Value 속성은 기본 속성이므로 생략할 수 있다.

For i = 0 To rs.Fields.Count
    List1.AddItem rs.Fields(i).Name
Next i