< 출처 : korea.internet.com, 지은이 : 최현진 >
Connection 개체의 메서드
메서드 | 설명 |
BeginTrans | 진행 중인 명령(Command)의 실행을 중단한다. |
Cancel | 진행 중인 명령(Command)의 실행을 중단한다. |
Close | 활성화된 Connection 개체를 닫는다. |
CommitTrans | 활성화된 Connection 개체에서 현재의 트랜잭션을 Commit한다. |
Execute | 명령을 실행한다. 만약 Recordset이 반환된다면, 디폴트 Recordset 개체로 반환된다. |
Open | Connection 개체를 데이터 소스에 연결한다. |
OpenSchema | Recordset 개체의 스키마 정보를 반환한다. |
RollbackTrans | 활성화된 Connection 개체에서 현재의 트랜잭션을 Rollback 한다. |
BeginTrans, CommitTrans, RollbackTrans 메서드
이 세개의 메서드는 트랜잭션을 관리하는 메서드이다. BeginTrans 메서드는 새로운 트랜잭션을 시작하며, CommitTrans 메서드는 시작된 트랜잭션의 변경된 내용을 저장하고 트랜잭션을 종료시킨다. RollbackTrans 메서드는 시작된 트랜잭션 동안에 변경된 내용을 취소하고 트랜잭션을 종료시킨다.
이 세 메서드는 다음과 같은 구문을 사용한다.
adoCn.CommitTrans
adoCn.RollbackTrans
BeginTrans, CommitTrans, RollbackTrans 메서드는 CusorLocation이 클라이언트인 Connection 개체에서는 작동하지 않는다.
[예제 1]
다음 예제는 Pubs 데이터베이스의 Titles 테이블의 Type 필드의 값이 "psychology"인 필드의 값을 "self_help"로 변경한 후, 코드의 마지막에서 트랜잭션을 Rollback 하는 예이다.
Private Sub cmdBeginTrans_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 "Titles", adoCn, adOpenKeyset, adLockOptimistic, adCmdTable
adoCn.BeginTrans
'Type이 "psychology" 이면 "self_help"로 변경한다.
Do Until adoRs.EOF
If Trim(adoRs!Type) = "psychology" Then
adoRs!Type = "self_help"
adoRs.Update
End If
adoRs.MoveNext
Loop
'데이터베이스로부터 다시 Recordset의 내용을 가져온다.
adoRs.Requery
adoRs.MoveFirst
Do While Not adoRs.EOF
Debug.Print adoRs!Title & " - " & adoRs!Type
adoRs.MoveNext
Loop
'모든 변경 작업을 취소한다.
adoCn.RollbackTrans
adoRs.Requery
adoRs.MoveFirst
Do While Not adoRs.EOF
Debug.Print adoRs!Title & " - " & adoRs!Type
adoRs.MoveNext
Loop
adoRs.Close
Set adoRs = Nothing
adoCn.Close
Set adoCn = Nothing
End Sub
[예제 2]
다음 예제는 Recordset 개체를 통한 트랜잭션이 아니라 Connection 개체의 Execute 메서드를 사용한 트랜잭션을 Rollback 하는 예이다.
Private Sub cmdRollbackTrans_Click()
Dim adoCn As New ADODB.Connection
Dim strConn As String
strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
adoCn.Open strConn
adoCn.BeginTrans
adoCn.Execute "Update Titles Set Type = 'self_help' Where Type = 'psychology'"
'모든 변경 작업을 취소한다.
adoCn.RollbackTrans
adoCn.Close
Set adoCn = Nothing
End Sub
Cancel 메서드
Cancel 메서드는 비동기적으로 실행중인 명령을 중지시킨다. Cancel 메서드는 Connection 개체의 Execute, Open 메서드에 의해서 실행된 명령을 중지시킬 수 있으며, 이 메서드들은 adConnectAsync, adExecuteAsync 옵션으로 시작되었어야만 한다. 그렇지 않을 경우에는 Cancel 메서드에 의해서 명령을 중지하려고 하면 오류가 발생한다.
Cancel 메서드는 Command 개체와 Recordset 개체에도 있다. Execute 메서드는 다음과 같은 매개변수를 갖는다.
[예제]
다음 예제는 비동기적으로 SQL 문장을 실행 한 다음에 For…Next 문장을 사용해서 시간을 지연시킨다. 그런 다음에 여전히 SQL 문장이 실행 중이면 Cancel 메서드를 사용해서 작업을 중지하고 트랜잭션을 Rollback 시키고, 실행이 완료되었으면 트랜잭션을 Commit 하는 예이다.
Private Sub cmdCancel_Click()
Dim adoCn As New ADODB.Connection
Dim strConn As String
Dim Sql As String
Dim i As Integer
strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
adoCn.Open strConn
Sql = "UPDATE Titles SET Type = 'self_help' WHERE type = 'psychology'"
adoCn.BeginTrans
adoCn.Execute Sql, , adAsyncExecute
'비동기적으로 처리하기 때문에 Update문장이 수행되는 동안 다른 작업이 진행됨을 보여준다.
For i = 1 To 10
Debug.Print i
Next i
'For...Next문이 수행되는 동안 Update 작업이 완료되지 않았다면 작업을 Cancel 시키고 Rollback 한다. 작업이 완료되었다면 Commit한다.
If adoCn.State = adStateExecuting Then
adoCn.Cancel
adoCn.RollbackTrans
MsgBox "Update canceled."
Else
adoCn.CommitTrans
MsgBox "Update complete."
End If
adoCn.Close
Set adoCn = Nothing
End Sub
Close 메서드
Close 메서드는 열려진 Connection 개체와 그 하위 개체를 닫는 메서드이다. Connection 개체 또는 Recordset 개체에서 이 메서드를 사용하게 되면 해당 개체가 사용하던 시스템의 자원들이 반환되며, 개체가 사용한 메모리를 완전히 반환하기 위해서는 Set문을 사용해서 개체 변수를 Nothing으로 설정한다.
Connection 개체의 CommandTimeout 속성의 설정 값은 Command 개체의 CommandTimeout 속성 값에 영향을 미치지 못한다. 그 이유는 Connection 개체의 CommandTimeout 속성은 Command 개체의 CommandTimeout 속성에 상속되지 않기 때문이다.
Connection 개체를 Close 메서드를 사용해서 닫을 경우에 만약 하위 Recordset 개체가 사용중이었다면, Recordset에 의해서 진행 중이던 트랜잭션은 Provider에 의해서 자동으로 Rollback 된다.
[예제]
다음 예제는 Pubs 데이터베이스에 접속하고 연결을 끊는 예이다.
Private Sub cmdClose_Click()
Dim adoCn As New ADODB.Connection
adoCn.Open "DSN=Pubs"
adoCn.Close
Set adoCn = Nothing
End Sub
클라이언트에서 Connection 개체의 Close 메서드를 수행하면 서버 측에서는 Connection 개체와 데이터베이스를 연결하기 위해서 사용했던 시스템 리소스를 반환한다.
Execute 메서드
Execute 메서드는 다음과 같은 구문을 사용한다.
Recordst 개체가 반환될 경우
Recordset 개체가 반환되지 않을 경우
매개변수
데이터 형식
설명
CommandText
String
수행할 명령을 기술하는 매개변수이며, SQL 문장, 테이블 명, 저장 프로시저를 지정할 수 있다.
RecordsAffected
Long
Execute 메서드에 의해서 영향을 받은 레코드의 개수를 반환한다. 예를 들면 Delete문장을 수행했는데, 10 개의 레코드가 삭제되었다면, 10 이라는 값을 반환한다.
Options
Long
Provider가 CommandText를 어떻게 수행할지를 결정하는 방법을 지정하는 값이며, 데이터 형식은 Long이다.
Options 매개변수는 다음 중 하나의 값을 가질 수 있다.
상수
설명
adCmdText
CommandText의 값을 SQL 문장으로 처리한다.
adCmdTable
CommandText의 값을 테이블 명으로 하는 SQL 문장을 만들어서 처리한다.
adCmdTableDirect
CommandText의 값을 테이블 명으로 처리한다.
adCmdStoredProc
CommandText의 값을 저장 프로시저로 처리한다.
adCmdUnknown
명령의 형식을 알 수 없음으로 처리한다.
adAsyncExecute
명령을 비동기적으로 수행한다.
adAsyncFetch
CacheSize 속성에 지정된 수 만큼의 레코드씩 비동기적으로 처리한다.
ReturnValue(Recordset)는 수행된 명령이 결과값을 반환할 경우 디폴트 Recordset으로 생성해서 반환한다.
Execute 메서드의 수행이 완료되면 ExecuteComplete 이벤트가 발생한다.
Execute 메서드의 수행 결과가 Recordset을 반환 할 경우, 디폴트 형태로 생성된 Recordset은 읽기 전용이고, forward-only 커서이다. 그래서 Recordset 개체로 데이터를 수정할 목적이라면 Recordset 개체의 Open 메서드를 사용해서 수정 가능한 Recordset 개체를 열어야 한다.
[예제]
다음 예제는 Execute 메서드를 통해서 변경된 레코드의 개수를 보여주며, Execute 메서드를 수행하기 전과 후의 데이터를 비교해서 직접 실행창에 보여주는 예이다.
Private Sub cmdExecute_Click()
Dim adoCn As New ADODB.Connection
Dim strConn As String
Dim Sql As String
Dim iAffected As Integer
Dim adoRs As New ADODB.Recordset
Sql = "UPDATE Titles SET Type = 'self_help' WHERE Type = 'psychology'"
'Connection 연결
strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "
adoCn.Open strConn
adoRs.Open "Titles", adoCn, adOpenStatic, adLockOptimistic
'Update 문장을 수행하기 전의 데이터
While Not adoRs.EOF
Debug.Print adoRs!Title & ", " & adoRs!Type & vbCrLf
adoRs.MoveNext
Wend
adoCn.Execute Sql, iAffected
'Update 문장에 영향을 받은 레코드 수
Debug.Print iAffected & "개의 레코드가 변경되었음."
adoRs.Requery
'Update 문장을 수행한 후의 데이터
Do While Not adoRs.EOF
Debug.Print adoRs!Title & ", " & adoRs!Type & vbCrLf
adoRs.MoveNext
Loop
adoRs.Close
Set adoRs = Nothing
adoCn.Close
Set adoCn = Nothing
End Sub
Open 메서드
Open 메서드는 다음과 같은 구문을 사용한다.
ConnectionString은 데이터베이스 연결에 사용할 정보를 지정하는 Connection 개체의 속성이며, User ID는 데이터베이스의 사용자 계정이며, Password는 사용자 계정의 암호이다. 옵션은 Connection 개체를 동기적 또는 비동기적으로 연결할 때 사용하는 매개변수로서 옵션을 adAsyncConnect로 지정하면 비동기적으로 Connection 개체를 연결하며, Connection 개체가 성공적으로 데이터 소스에 연결 되면 ConnectComplete 이벤트가 발생한다. 디폴트 값을 동기적으로 데이터 소스에 연결하는 것이다.
Open 메서드를 사용하기 전에 Connection 개체의 ConnectionString 속성을 이미 설정했다면, ConnectionString 매개변수는 지정하지 않아도 된다. 이유는 Connection 개체의 ConnectionString 속성이 Open 메서드의 ConnectionString 매개변수로 상속되기 때문이다.
[예제1]
다음 예제는 Pubs 데이터베이스에 Connection 개체를 연결하는 예이다.
Private Sub cmdOpen_Click()
Dim adoCn As New ADODB.Connection
Dim strConn As String
strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "
adoCn.Open strConn
Debug.Print "Opened"
adoCn.Close
Set adoCn = Nothing
Debug.Print "Closed"
End Sub
[예제 2]
다음 예제는 Pubs 데이터베이스에 Connection 개체를 비동기적으로 연결하는 예이다.
Private Sub cmdOpenAsync_Click()
Dim adoCn As New ADODB.Connection
Dim strConn As String
strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "
adoCn.Open strConn, , , adAsyncConnect
Debug.Print "Opened - Async"
adoCn.Close
Set adoCn = Nothing
Debug.Print "Closed"
End Sub
OpenSchema 메서드
OpenSchema 메서드는 Provider를 통해서 데이터베이스의 스키마 정보를 얻는 메서드이며, 다음과 같은 구문을 사용한다.
반환되는 Recordset은 데이터베이스에 대한 스키마 정보를 갖고 있으며, 읽기 전용의 Static 커서로 되어 있다.
QueryType은 질의의 타입을 지정하는 매개변수이며, Criteria는 QueryType에 따라서 지정하는 질의의 조건이며 선택사항이다.
QueryType 값 | Criteria 값 |
adSchemaAsserts | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME |
adSchemaCatalogs | CATALOG_NAME |
adSchemaCharacterSets | CHARACTER_SET_CATALOG CHARACTER_SET_SCHEMA CHARACTER_SET_NAME |
adSchemaCheckConstraints | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME |
adSchemaCollations | COLLATION_CATALOG COLLATION_SCHEMA COLLATION_NAME |
adSchemaColumnDomainUsage | DOMAIN_CATALOG DOMAIN_SCHEMA DOMAIN_NAME COLUMN_NAME |
adSchemaColumnPrivileges | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME GRANTOR GRANTEE |
adSchemaColumns | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAM |
adSchemaConstraintColumnUsage | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME/td> |
adSchemaConstraintTableUsage | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME |
adSchemaForeignKeys | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME FK_TABLE_CATALOG FK_TABLE_SCHEMA FK_TABLE_NAME |
adSchemaIndexes | TABLE_CATALOG TABLE_SCHEMA INDEX_NAME TYPE TABLE_NAME |
adSchemaKeyColumnUsage | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME |
adSchemaPrimaryKeys | PK_TABLE_CATALOG PK_TABLE_SCHEMA PK_TABLE_NAME |
adSchemaProcedureColumns | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME COLUMN_NAME |
adSchemaProcedureParameters | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PARAMTER_NAME |
adSchemaProcedures | PROCEDURE_CATALOG PROCEDURE_SCHEMA PROCEDURE_NAME PARAMTER_TYPE |
adSchemaProviderSpecific | 아래 설명 참조 |
adSchemaProviderTypes | DATA_TYPE BEST_MATCH |
adSchemaReferentialConstraints | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME |
adSchemaSchemata | CATALOG_NAME SCHEMA_NAME SCHEMA_OWNER |
adSchemaSQLLanguages | <없음> |
adSchemaStatistics | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME |
adSchemaTableConstraints | CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE |
adSchemaTablePrivileges | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME GRANTOR GRANTEE |
adSchemaTables | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE |
adSchemaTranslations | TRANSLATION_CATALOG TRANSLATION_SCHEMA TRANSLATION_NAME |
adSchemaUsagePrivileges | OBJECT_CATALOG OBJECT_SCHEMA OBJECT_NAME OBJECT_TYPE GRANTOR GRANTEE |
adSchemaViewColumnUsage | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME |
adSchemaViewTableUsage | VIEW_CATALOG VIEW_SCHEMA VIEW_NAME |
adSchemaViews | TABLE_CATALOG TABLE_SCHEMA TABLE_NAME |
SchemaID는 OLE DB의 사양에 의해서 정의되지 않은 Provider 스키마 질의를 위한 GUID이다. 만약 QueryType을 adSchemaProviderSpecific으로 설정했을 경우에만 반드시 필요하다.
OpenSchema 메서드는 서버에 있는 데이터베이스의 정보 또는 테이블의 필드의 정보와 같은 데이터 소스의 정보를 반환하는 메서드이다.
Criteria 인수는 스키마 질의의 결과로 사용되어질 수 있는 값들의 배열이다. 각 스키마 질의는 각각의 서로 다른 매개변수를 가지며, 실제 스키마는 IDBSchemaRowset 인터페이스 하에서 OLE DB의 사양에 의해서 정의된다.
QueryType 인수로 adSchemaProviderSpecific가 사용되면 Provider는 비 표준 스키마 질의를 생성하며, SchemaID 인수는 실행하기 위해서 스키마 질의의 GUID를 요구하게 된다. 만약 SchemaID를 지정하지 않으면 실행 오류가 발생하게 된다.
Provider는 OEL DB 표준 스키마 질의의 모두를 지원하기를 요구하지 않는다. 특별히 adSchemaTables, adSchemaColumns, adSchemaProviderTypes 이 세가지만, OLE DB의 사용을 요구하고 있다.
OpenSchema 메서드는 클라이언트 측의 Connection 개체에서는 사용할 수 없다.
[예제 1]
다음 예제는 SQL 서버의 Pubs 데이터베이스의 테이블에 대한 정보를 조회하는 예이다.
Private Sub cmdOpenSchema_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
Set adoRs = adoCn.OpenSchema(adSchemaTables)
Do Until adoRs.EOF
Debug.Print "테이블명: " & adoRs!Table_Name & vbCrLf & _
"테이블 타입: " & adoRs!Table_Type & vbCr
adoRs.MoveNext
Loop
adoRs.Close
Set adoRs = Nothing
adoCn.Close
Set adoCn = Nothing
End Sub
[예제 2]
다음 예제는 Criteria 매개변수를 이용해서 Pubs 데이터베이스의 뷰(View)에 대한 정보를 조회하는 예이다.
Private Sub cmdOpenSchema2_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
Set adoRs = adoCn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty, "VIEW"))
Do Until adoRs.EOF
Debug.Print "테이블 명: " & adoRs!Table_Name & vbCrLf & _
"테이블 타입:" & adoRs!Table_Type & vbCr
adoRs.MoveNext
Loop
adoRs.Close
Set adoRs = Nothing
adoCn.Close
Set adoCn = Nothing
End Sub