4.4. ADO에 대한 모든 것 - Command : Command 개체의 메서드
< 출처 : 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 개체를 생성할 때 사용되는 메서드이며, 구문은 다음과 같다.
매개변수는 다음과 같다.
매개변수 | 형식 | 설명 |
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 문장 또는 저장 프로시저를 실행하는 메서드이며, 구문은 다음과 같다.
레코드를 반환하도록 실행하기 위해서는 다음과 같이 코드를 작성한다.
레코드를 반환하지 않도록 실행하기 위해서는 다음과 같이 코드를 작성한다.
매개변수는 다음과 같다
매개변수 | 형식 | 설명 |
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를 사용할 수 있다. 예제 코드는 다음과 같다.