Web/ASP & ASP.NET2009. 4. 9. 19:54

< 출처 : 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.BeginTrans
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 개체에도 있다.

[예제]
다음 예제는 비동기적으로 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 개체가 반환될 경우
Set Recordset = Connection.Execute (CommandText As String, [RecordsAffected As Long], [Options As Enum])

Recordset 개체가 반환되지 않을 경우
Connection.Execute CommandText As String, [RecordsAffected As Long], [Options As Enum]

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 메서드를 수행하기 전과 후의 데이터를 비교해서 직접 실행창에 보여주는 예이다.

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 메서드는 다음과 같은 구문을 사용한다.
Open [ConnectionString As String], [UserID As String], [Password As String], [Options As Enum]

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를 통해서 데이터베이스의 스키마 정보를 얻는 메서드이며, 다음과 같은 구문을 사용한다.
Set Recordset = Connection.OpenSchema (QueryType, Criteria, SchemaID)

반환되는 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
Posted by Huikyun