Web/ASP & ASP.NET2009. 4. 9. 23:51

< 출처 : korea.internet.com, 지은이 : 최현진 >

제 4절 Command 개체의 메서드


메서드 설명
Cancel 실행 중인 명령을 중지한다.
CreateParameter 새로운 Parameter 개체를 생성한다.
Execute 명령을 실행한다.



Cancel 메서드

Cancel 메서드는 비동기적으로 실행 중인 Execute 메서드를 중지시킬 때 사용하는 메서드이다. Cancel 메서드를 사용하기 위해서는 Execute 메서드에서 adAsyncExecute 옵션을 사용해야만 한다. 비동기적으로 Execute 메서드를 사용하지 않은 상태에서 Cancel 메서드를 사용하면 오류가 발생한다.

[예제]
다음 예제는 Command 개체를 비동기적으로 실행한 후에 0부터 10까지 루프를 수행하면서 시간을 지연시킨 다음, 아직도 Command 개체가 수행 중이면, 작업을 취소하는 예이다.

Public Sub cmdCancel_Click()
  Dim adoCn As New ADODB.Connection
  Dim adoCmd As New ADODB.Command
  Dim strConn As String
  Dim strCmd As String
  Dim i As Integer

  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
  adoCn.Open strConn

  strCmd = "UPDATE Titles SET Type = 'self_help' WHERE Type = 'psychology'"

  adoCmd.ActiveConnection = adoCn
  adoCmd.CommandText = strCmd
  adoCmd.Execute strCmd, , adAsyncExecute

  '시간을 지연시키기 위한 코드
  For i = 0 To 10
    Debug.Print i
  Next i

  If CBool(adoCmd.State And adStateExecuting) Then
    adoCmd.Cancel

    MsgBox "Update 취소"
  Else
    MsgBox "Update 완료"
  End If

  adoCn.Close
  Set adoCn = Nothing
End Sub

Cancel 메서드는 오랜 작업 시간을 요구하는 질의를 수행하는 경우에 해당 화면에 Cancel 메서드를 수행하는 명령 버튼을 제공할 때 사용한다.


CreateParameter 메서드

CreateParameter 메서드는 새로운 Parameter 개체를 생성할 때 사용되는 메서드이며, 구문은 다음과 같다.

Set parameter = Command.CreateParameter (Name, Type, Direction, Size, Value)

매개변수는 다음과 같다.


매개변수 형식 설명
Name String 선택사항. Parameter 개체의 이름을 지정하는 문자열이다
Type DataTypeEnum 선택사항. Parameter 개체의 데이터 형식을 지정하는 매개변수이며, 데이터 형식은 Long 이다. 정확한 설정을 위해서는 Parameter 개체의 Type 속성을 참조한다.
Direction ParameterDirectionEnum 선택사항. Parameter 개체의 형식을 지정하는 매개변수이며, 데이터 형식은 Long 이다. 정확한 설정을 위해서는 Parameter 개체의 Direction 속성을 참조한다.
Size Long 선택사항. 문자 또는 바이트 단위로 매개 변수 값의 최대 길이를 지정하는 매개 변수이며 데이터 형식은 Long 이다.
Value Variant 선택사항. Parameter 개체의 값을 지정하는 매개 변수이며 데이터 형식은 Variant 이다.


CreateParameter 메서드를 사용해서 새로운 Parameter 개체를 생성하면, Name, Type, Direction, Size, Value의 값들이 생성된 Parameter 개체의 해당 속성에 지정된다.

CreateParameter 메서드를 사용하는 방법에는 두 가지가 있으며, 첫번째는 다음과 같다.

Set adoPara = adoCmd.CreateParameter("Percentage", adInteger, adParamInput, 8, iRoyalty)

두 번째는 다음과 같이 매개변수로 값을 지정하는 것이 아니라 속성으로 값을 지정한다.
Set adoPara = adoCmd.CreateParameter
adoPara.Name = "Percentage"
adoPara.Type = adInteger
adoPara.Direction = adParamInput
adoPara.Size = 8
adoPara.Value = iRoyalty

위의 두 코드는 동일하게 수행된다.

새로운 Parameter 개체를 생성하면, 이것이 Command 개체의 Parameters 컬렉션에 자동으로 추가되는 것이 아니기 때문에 Appned 메서드를 사용해서 Parameters 컬렉션에 추가시켜야 한다.

만약 Type 속성에 가변 길이 데이터 형식을 지정했다면, Size 인수를 지정하든지, 또는 새로 생성한 Parameter 개체를 Parameters 컬렉션에 추가하기 전에 Parameter 개체의 Size 속성에 값을 설정해야만 오류가 발생하지 않는다.

[예제]
다음 예제는 CreateParameter 메서드를 사용해서 Pubs 데이터베이스의 byroyalty라는 저장 프로시저를 수행하는 예이다.
Public Sub cmdCreateParameter_Click()
  Dim adoCn As New ADODB.Connection
  Dim adoCmd As New ADODB.Command
  Dim adoPara As New ADODB.Parameter
  Dim adoRs As New ADODB.Recordset
  Dim iRoyalty As Integer
  Dim strConn As String

  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
  adoCn.Open strConn
  adoCn.CursorLocation = adUseClient

  adoCmd.CommandText = "byroyalty"
  adoCmd.CommandType = adCmdStoredProc

  '매개변수 값을 받아서 Parameter를 추가한다.
  iRoyalty = Trim(InputBox("Royalty 입력:"))

  Set adoPara = adoCmd.CreateParameter("Percentage", adInteger, adParamInput, 8, iRoyalty)
  adoCmd.Parameters.Append adoPara

  Set adoCmd.ActiveConnection = adoCn
  Set adoRs = adoCmd.Execute

  Debug.Print "Authors with " & iRoyalty & " percent royalty"

  Do While Not adoRs.EOF
    Debug.Print adoRs!au_id

    adoRs.MoveNext
  Loop

  adoRs.Close
  Set adoRs = Nothing

  adoCn.Close
  Set adoRs = Nothing
End Sub


Execute 메서드

Execute 메서드는 CommandText 속성에 지정된, SQL 문장 또는 저장 프로시저를 실행하는 메서드이며, 구문은 다음과 같다.

레코드를 반환하도록 실행하기 위해서는 다음과 같이 코드를 작성한다.

Set recordset = Cmmand.Execute( RecordsAffected, Parameters, Options )

레코드를 반환하지 않도록 실행하기 위해서는 다음과 같이 코드를 작성한다.

Command.Execute RecordsAffected, Parameters, Options

매개변수는 다음과 같다


매개변수 형식 설명
RecordsAffected Long 선택사항. Execute 메서드를 통해서 실행된 명령에 의해서 변경된 레코드의 개수를 나타낸다. 예를 들어 Insert 문장에 의해서 5개의 레코드가 삽입되었다면 5를 반환한다.
Parameters Variant 실행될 SQL 문장에 전달될 매개변수들의 값을 가진 Variant 배열이다.
Options Long 선택사항. Provider가 Command 개체의 ComandText 속성의 값을 어떻게 처리할 지를 지정하는 상수이며, 다음 표의 값들 중 하나를 지정할 수 있다.


다음 표는 Options 매개변수에 지정할 수 있는 값을 나타낸다.


상수 설명
adCmdText 1 Provider가 CommandText 속성의 값을 SQL 문장과 같은 텍스트로 이루어진 명령어로 평가하도록 지정한다.
adCmdTable 2 ADO가 CommandText 속성에 지정된 테이블의 모든 레코드를 반환하도록 SQL 문장을 생성하도록 지정한다.
adCmdTableDirect 512 CommandText 속성에 지정된 테이블의 모든 레코드를 반환하도록 지정한다.
adCmdStoredProc 4 Provider가 CommandText 속성의 값을 저장 프로시저로 평가하도록 지정한다.
adCmdUnknown 8 CommandText 속성의 값이 어떤 명령을 지정하는지 알 수 없도록 지정한다.
adAsyncExecute 16 명령을 비동기적으로 처리하도록 지정한다.
adAsyncFetch 32 CacheSize 속성에 지정된 만큼의 초기 레코드를 가져온 후에 남아 있는 레코드를 비동기적으로 처리하도록 지정한다.


Command 개체의 Execute 메서드는 CommandText 속성에 지정된 SQL 문장이나 테이블, 또는 저장 프로시저를 실행해서 Recordset 개체를 생성하는데 사용된다. 만약 Recordset 개체를 반환하지 않도록 처리하면, 닫혀진 Recordset 개체가 반환된다.

Command 개체를 사용해서 반환되는 Recordset 개체는 디폴트 Recordset 개체로서 CursorLocation 속성은 adUseServer(2) 이며, CursorType 속성은 adOpenForwardOnly(0) 이며, LockType 속성은 adLockReadOnly(1) 이다.

[예제]
다음 예제는 Pubs 데이터베이스의 Titles 테이블의 필드를 변경하는 SQL 문장을 수행하는 예이다.

Private Sub cmdExecute_Click()
  Dim adoCn As New ADODB.Connection
  Dim adoCmd As New ADODB.Command
  Dim adoErr As Object
  Dim Sql As String
  Dim strConn As String

  On Error GoTo ErrTrap

  Sql = "UPDATE Titles SET Type = 'self_help' WHERE Type = 'psychology'"

  strConn = "Provider=sqloledb;Data Source=(local);Initial Catalog=Pubs;User ID=sa;Password=;"
  adoCn.Open strConn

  Set adoCmd.ActiveConnection = adoCn
  adoCmd.CommandText = Sql
  adoCmd.Execute

  adoCn.Close
  Set adoCn = Nothing
Exit Sub

ErrTrap:
  If adoCn.Errors.Count > 0 Then
    For Each adoErr In adoCn.Errors
      MsgBox "오류 번호: " & adoErr.Number & vbCr & adoErr.Description
    Next adoErr
  End If

  Resume Next
End Sub

참고

Connection 개체와 Recordset 개체는 이벤트를 가지고 있지만, Command 개체는 이벤트를 가지고 있지 않다.

비동기적으로 Execute 메서드를 사용할 경우에는 Options 매개변수의 값으로 adAsyncExecute를 사용할 수 있다. 예제 코드는 다음과 같다.

adoCmd.Execute , , adCmdTable Or adAsyncExecute Or adAsyncFetch
Posted by Huikyun