다음을 통해 공유


명령으로 저장 프로시저 호출

명령을 사용하여 저장 프로시저를 호출할 수 있습니다. 이 항목의 끝에 있는 코드 샘플은 다음과 같이 정의된 CustOrdersOrders라는 Northwind 샘플 데이터베이스의 저장 프로시저를 참조합니다.

CREATE PROCEDURE CustOrdersOrders @CustomerID nchar(5) AS  
SELECT OrderID, OrderDate, RequiredDate, ShippedDate  
FROM Orders  
WHERE CustomerID = @CustomerID  
ORDER BY OrderID  

저장 프로시저를 정의하고 호출하는 방법에 대한 자세한 내용은 SQL Server 설명서를 참조하세요.

이 저장 프로시저는 명령 개체 매개 변수에 사용되는 명령과 유사합니다. 고객 ID 매개 변수를 사용하고 해당 고객의 주문에 대한 정보를 반환합니다. 다음 코드 샘플에서는 이 저장 프로시저를 ADO Recordset의 원본으로 사용합니다.

저장 프로시저를 사용하면 ADO의 다른 기능인 Parameters 컬렉션 Refresh 메서드에 액세스할 수 있습니다. 이 메서드를 사용하여 ADO는 런타임에 명령에 필요한 매개 변수에 대한 모든 정보를 자동으로 채울 수 있습니다. ADO는 데이터 원본에서 매개 변수에 대한 정보를 쿼리해야 하므로 이 기술을 사용하면 성능 저하가 발생합니다.

다음 코드 샘플과 매개 변수를 수동으로 입력한 명령 개체 매개 변수의 코드 간에는 다른 중요한 차이점이 있습니다. 첫째, 이 코드는 SQL Server 저장 프로시저이며 정의에 의해 미리 컴파일되므로 Prepared 속성을 True로 설정하지 않습니다. 둘째, Command 개체의 CommandType 속성이 ADO에 명령이 저장 프로시저임을 알리기 위해 두 번째 예제에서 adCmdStoredProc로 변경되었습니다.

마지막으로 두 번째 예제에서는 디자인 타임에 매개 변수의 이름을 알 수 없으므로 값을 설정할 때 인덱스로 매개 변수를 참조해야 합니다. 매개 변수의 이름을 알고 있는 경우 Command 개체의 새 NamedParameters 속성을 True로 설정하고 속성의 이름을 참조할 수 있습니다. 저장 프로시저(@CustomerID)에 언급된 첫 번째 매개 변수의 위치가 0(objCmd(1) = "ALFKI")이 아닌 1인 이유가 궁금할 수 있습니다. 이는 매개 변수 0에 SQL Server 저장 프로시저의 반환 값이 포함되어 있기 때문입니다.

'BeginAutoParamCmd  
    On Error GoTo ErrHandler:  
  
    Dim objConn As New ADODB.Connection  
    Dim objCmd As New ADODB.Command  
    Dim objParm1 As New ADODB.Parameter  
    Dim objRs As New ADODB.Recordset  
  
    ' Set CommandText equal to the stored procedure name.  
    objCmd.CommandText = "CustOrdersOrders"  
    objCmd.CommandType = adCmdStoredProc  
  
    ' Connect to the data source.  
    Set objConn = GetNewConnection  
    objCmd.ActiveConnection = objConn  
  
    ' Automatically fill in parameter info from stored procedure.  
    objCmd.Parameters.Refresh  
  
    ' Set the param value.  
    objCmd(1) = "ALFKI"  
  
    ' Execute once and display...  
    Set objRs = objCmd.Execute  
  
    Debug.Print objParm1.Value  
    Do While Not objRs.EOF  
        Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _  
                    objRs(2) & vbTab & objRs(3)  
        objRs.MoveNext  
    Loop  
  
    ' ...then set new param value, re-execute command, and display.  
    objCmd(1) = "CACTU"  
    Set objRs = objCmd.Execute  
  
    Debug.Print objParm1.Value  
    Do While Not objRs.EOF  
        Debug.Print vbTab & objRs(0) & vbTab & objRs(1) & vbTab & _  
                    objRs(2) & vbTab & objRs(3)  
        objRs.MoveNext  
    Loop  
  
    'clean up  
    objRs.Close  
    objConn.Close  
    Set objRs = Nothing  
    Set objConn = Nothing  
    Set objCmd = Nothing  
    Set objParm1 = Nothing  
    Exit Sub  
  
ErrHandler:  
    'clean up  
    If objRs.State = adStateOpen Then  
        objRs.Close  
    End If  
  
    If objConn.State = adStateOpen Then  
        objConn.Close  
    End If  
  
    Set objRs = Nothing  
    Set objConn = Nothing  
    Set objCmd = Nothing  
    Set objParm1 = Nothing  
  
    If Err <> 0 Then  
        MsgBox Err.Source & "-->" & Err.Description, , "Error"  
    End If  
'EndAutoParamCmd  
  
'BeginNewConnection  
Private Function GetNewConnection() As ADODB.Connection  
    Dim oCn As New ADODB.Connection  
    Dim sCnStr As String  
  
    sCnStr = "Provider='SQLOLEDB';Data Source='MySqlServer';" & _  
             "Integrated Security='SSPI';Initial Catalog='Northwind';"  
    oCn.Open sCnStr  
  
    If oCn.State = adStateOpen Then  
        Set GetNewConnection = oCn  
    End If  
  
End Function  
'EndNewConnection  

참고 항목

기술 자료 문서 117500