< 출처 : 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 하는 예이다.
01.
<font size=
"2"
>
Private
Sub
cmdBeginTrans_Click()
02.
Dim
adoCn
As
New
ADODB.Connection
03.
Dim
adoRs
As
New
ADODB.Recordset
04.
Dim
strConn
As
String
05.
06.
strConn =
"Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "
07.
adoCn.Open strConn
08.
adoRs.Open
"Titles"
, adoCn, adOpenKeyset, adLockOptimistic, adCmdTable
09.
10.
adoCn.BeginTrans
11.
12.
'Type이 "psychology" 이면 "self_help"로 변경한다.
13.
Do
Until
adoRs.EOF
14.
If
Trim(adoRs!Type) =
"psychology"
Then
15.
adoRs!Type =
"self_help"
16.
adoRs.Update
17.
End
If
18.
19.
adoRs.MoveNext
20.
Loop
21.
22.
'데이터베이스로부터 다시 Recordset의 내용을 가져온다.
23.
adoRs.Requery
24.
adoRs.MoveFirst
25.
26.
Do
While
Not
adoRs.EOF
27.
Debug.Print adoRs!Title &
" - "
& adoRs!Type
28.
adoRs.MoveNext
29.
Loop
30.
31.
'모든 변경 작업을 취소한다.
32.
adoCn.RollbackTrans
33.
34.
adoRs.Requery
35.
adoRs.MoveFirst
36.
37.
Do
While
Not
adoRs.EOF
38.
Debug.Print adoRs!Title &
" - "
& adoRs!Type
39.
adoRs.MoveNext
40.
Loop
41.
42.
adoRs.Close
43.
Set
adoRs =
Nothing
44.
45.
adoCn.Close
46.
Set
adoCn =
Nothing
47.
End
Sub
48.
</font>
[예제 2]
다음 예제는 Recordset 개체를 통한 트랜잭션이 아니라 Connection 개체의 Execute 메서드를 사용한 트랜잭션을 Rollback 하는 예이다.
01.
Private
Sub
cmdRollbackTrans_Click()
02.
Dim
adoCn
As
New
ADODB.Connection
03.
Dim
strConn
As
String
04.
05.
strConn =
"Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
06.
adoCn.Open strConn
07.
08.
adoCn.BeginTrans
09.
adoCn.Execute
"Update Titles Set Type = 'self_help' Where Type = 'psychology'"
10.
11.
'모든 변경 작업을 취소한다.
12.
adoCn.RollbackTrans
13.
14.
adoCn.Close
15.
Set
adoCn =
Nothing
16.
End
Sub
Cancel 메서드
Cancel 메서드는 비동기적으로 실행중인 명령을 중지시킨다. Cancel 메서드는 Connection 개체의 Execute, Open 메서드에 의해서 실행된 명령을 중지시킬 수 있으며, 이 메서드들은 adConnectAsync, adExecuteAsync 옵션으로 시작되었어야만 한다. 그렇지 않을 경우에는 Cancel 메서드에 의해서 명령을 중지하려고 하면 오류가 발생한다.
Cancel 메서드는 Command 개체와 Recordset 개체에도 있다.
[예제]
다음 예제는 비동기적으로 SQL 문장을 실행 한 다음에 For…Next 문장을 사용해서 시간을 지연시킨다. 그런 다음에 여전히 SQL 문장이 실행 중이면 Cancel 메서드를 사용해서 작업을 중지하고 트랜잭션을 Rollback 시키고, 실행이 완료되었으면 트랜잭션을 Commit 하는 예이다.
01.
<font size=
"2"
>
Private
Sub
cmdCancel_Click()
02.
Dim
adoCn
As
New
ADODB.Connection
03.
Dim
strConn
As
String
04.
Dim
Sql
As
String
05.
Dim
i
As
Integer
06.
07.
strConn =
"Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
08.
adoCn.Open strConn
09.
10.
Sql =
"UPDATE Titles SET Type = 'self_help' WHERE type = 'psychology'"
11.
12.
adoCn.BeginTrans
13.
14.
adoCn.Execute Sql, , adAsyncExecute
15.
16.
'비동기적으로 처리하기 때문에 Update문장이 수행되는 동안 다른 작업이 진행됨을 보여준다.
17.
For
i = 1
To
10
18.
Debug.Print i
19.
Next
i
20.
21.
'For...Next문이 수행되는 동안 Update 작업이 완료되지 않았다면 작업을 Cancel 시키고 Rollback 한다. 작업이 완료되었다면 Commit한다.
22.
If
adoCn.State = adStateExecuting
Then
23.
adoCn.Cancel
24.
adoCn.RollbackTrans
25.
26.
MsgBox
"Update canceled."
27.
Else
28.
adoCn.CommitTrans
29.
30.
MsgBox
"Update complete."
31.
End
If
32.
33.
adoCn.Close
34.
Set
adoCn =
Nothing
35.
End
Sub
36.
</font>
Close 메서드
Close 메서드는 열려진 Connection 개체와 그 하위 개체를 닫는 메서드이다. Connection 개체 또는 Recordset 개체에서 이 메서드를 사용하게 되면 해당 개체가 사용하던 시스템의 자원들이 반환되며, 개체가 사용한 메모리를 완전히 반환하기 위해서는 Set문을 사용해서 개체 변수를 Nothing으로 설정한다.
Connection 개체의 CommandTimeout 속성의 설정 값은 Command 개체의 CommandTimeout 속성 값에 영향을 미치지 못한다. 그 이유는 Connection 개체의 CommandTimeout 속성은 Command 개체의 CommandTimeout 속성에 상속되지 않기 때문이다.
Connection 개체를 Close 메서드를 사용해서 닫을 경우에 만약 하위 Recordset 개체가 사용중이었다면, Recordset에 의해서 진행 중이던 트랜잭션은 Provider에 의해서 자동으로 Rollback 된다.
[예제]
다음 예제는 Pubs 데이터베이스에 접속하고 연결을 끊는 예이다.
1.
Private
Sub
cmdClose_Click()
2.
Dim
adoCn
As
New
ADODB.Connection
3.
4.
adoCn.Open
"DSN=Pubs"
5.
6.
adoCn.Close
7.
Set
adoCn =
Nothing
8.
End
Sub
클라이언트에서 Connection 개체의 Close 메서드를 수행하면 서버 측에서는 Connection 개체와 데이터베이스를 연결하기 위해서 사용했던 시스템 리소스를 반환한다.
Execute 메서드
Execute 메서드는 다음과 같은 구문을 사용한다.
Recordst 개체가 반환될 경우
Recordset 개체가 반환되지 않을 경우
Execute 메서드는 다음과 같은 매개변수를 갖는다.
매개변수 | 데이터 형식 | 설명 |
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 메서드를 수행하기 전과 후의 데이터를 비교해서 직접 실행창에 보여주는 예이다.
01.
<strong><font size=
"2"
>
Private
Sub
cmdExecute_Click()
02.
Dim
adoCn
As
New
ADODB.Connection
03.
Dim
strConn
As
String
04.
Dim
Sql
As
String
05.
Dim
iAffected
As
Integer
06.
Dim
adoRs
As
New
ADODB.Recordset
07.
08.
Sql =
"UPDATE Titles SET Type = 'self_help' WHERE Type = 'psychology'"
09.
10.
'Connection 연결
11.
strConn =
"Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=; "
12.
13.
adoCn.Open strConn
14.
15.
adoRs.Open
"Titles"
, adoCn, adOpenStatic, adLockOptimistic
16.
17.
'Update 문장을 수행하기 전의 데이터
18.
While
Not
adoRs.EOF
19.
Debug.Print adoRs!Title &
", "
& adoRs!Type & vbCrLf
20.
21.
adoRs.MoveNext
22.
Wend
23.
24.
adoCn.Execute Sql, iAffected
25.
26.
'Update 문장에 영향을 받은 레코드 수
27.
Debug.Print iAffected &
"개의 레코드가 변경되었음."
28.
29.
adoRs.Requery
30.
31.
'Update 문장을 수행한 후의 데이터
32.
Do
While
Not
adoRs.EOF
33.
Debug.Print adoRs!Title &
", "
& adoRs!Type & vbCrLf
34.
35.
adoRs.MoveNext
36.
Loop
37.
38.
adoRs.Close
39.
Set
adoRs =
Nothing
40.
41.
adoCn.Close
42.
Set
adoCn =
Nothing
43.
End
Sub
44.
</font></strong>
Open 메서드
Open 메서드는 다음과 같은 구문을 사용한다.
ConnectionString은 데이터베이스 연결에 사용할 정보를 지정하는 Connection 개체의 속성이며, User ID는 데이터베이스의 사용자 계정이며, Password는 사용자 계정의 암호이다. 옵션은 Connection 개체를 동기적 또는 비동기적으로 연결할 때 사용하는 매개변수로서 옵션을 adAsyncConnect로 지정하면 비동기적으로 Connection 개체를 연결하며, Connection 개체가 성공적으로 데이터 소스에 연결 되면 ConnectComplete 이벤트가 발생한다. 디폴트 값을 동기적으로 데이터 소스에 연결하는 것이다.
Open 메서드를 사용하기 전에 Connection 개체의 ConnectionString 속성을 이미 설정했다면, ConnectionString 매개변수는 지정하지 않아도 된다. 이유는 Connection 개체의 ConnectionString 속성이 Open 메서드의 ConnectionString 매개변수로 상속되기 때문이다.
[예제1]
다음 예제는 Pubs 데이터베이스에 Connection 개체를 연결하는 예이다.
01.
Private
Sub
cmdOpen_Click()
02.
Dim
adoCn
As
New
ADODB.Connection
03.
Dim
strConn
As
String
04.
05.
strConn =
"Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "
06.
adoCn.Open strConn
07.
08.
Debug.Print
"Opened"
09.
10.
adoCn.Close
11.
Set
adoCn =
Nothing
12.
13.
Debug.Print
"Closed"
14.
End
Sub
[예제 2]
다음 예제는 Pubs 데이터베이스에 Connection 개체를 비동기적으로 연결하는 예이다.
01.
Private
Sub
cmdOpenAsync_Click()
02.
Dim
adoCn
As
New
ADODB.Connection
03.
Dim
strConn
As
String
04.
05.
strConn =
"Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User Id=sa;Password=; "
06.
adoCn.Open strConn, , , adAsyncConnect
07.
08.
Debug.Print
"Opened - Async"
09.
10.
adoCn.Close
11.
Set
adoCn =
Nothing
12.
13.
Debug.Print
"Closed"
14.
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 데이터베이스의 테이블에 대한 정보를 조회하는 예이다.
01.
<font size=
"2"
>
Private
Sub
cmdOpenSchema_Click()
02.
Dim
adoCn
As
New
ADODB.Connection
03.
Dim
adoRs
As
New
ADODB.Recordset
04.
Dim
strConn
As
String
05.
06.
strConn =
"Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
07.
adoCn.Open strConn
08.
09.
Set
adoRs = adoCn.OpenSchema(adSchemaTables)
10.
11.
Do
Until
adoRs.EOF
12.
Debug.Print
"테이블명: "
& adoRs!Table_Name & vbCrLf & _
13.
"테이블 타입: "
& adoRs!Table_Type & vbCr
14.
adoRs.MoveNext
15.
Loop
16.
17.
adoRs.Close
18.
Set
adoRs =
Nothing
19.
20.
adoCn.Close
21.
Set
adoCn =
Nothing
22.
End
Sub
23.
</font>
[예제 2]
다음 예제는 Criteria 매개변수를 이용해서 Pubs 데이터베이스의 뷰(View)에 대한 정보를 조회하는 예이다.
01.
Private
Sub
cmdOpenSchema2_Click()
02.
Dim
adoCn
As
New
ADODB.Connection
03.
Dim
adoRs
As
New
ADODB.Recordset
04.
Dim
strConn
As
String
05.
06.
strConn =
"Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
07.
adoCn.Open strConn
08.
09.
Set
adoRs = adoCn.OpenSchema(adSchemaTables, Array(Empty, Empty, Empty,
"VIEW"
))
10.
11.
Do
Until
adoRs.EOF
12.
Debug.Print
"테이블 명: "
& adoRs!Table_Name & vbCrLf & _
13.
"테이블 타입:"
& adoRs!Table_Type & vbCr
14.
15.
adoRs.MoveNext
16.
Loop
17.
18.
adoRs.Close
19.
Set
adoRs =
Nothing
20.
21.
adoCn.Close
22.
Set
adoCn =
Nothing
23.
End
Sub