Aufrufen einer gespeicherten Prozedur mit einem Befehl

Sie können einen Befehl verwenden, um eine gespeicherte Prozedur aufzurufen. Das Codebeispiel am Ende dieses Artikels bezieht sich auf eine gespeicherte Prozedur namens „CustOrdersOrders“ in der Northwind-Beispieldatenbank, die wie folgt definiert ist.

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

Weitere Informationen zum Definieren und Aufrufen gespeicherter Prozeduren finden Sie in der SQL Server-Dokumentation.

Diese gespeicherte Prozedur ähnelt dem Befehl, der in den Befehlsobjektparametern verwendet wird. Sie verwendet einen Kunden-ID-Parameter und gibt Informationen zu den Bestellungen dieses Kunden zurück. Im folgenden Codebeispiel wird diese gespeicherte Prozedur als Quelle für ein ADO-Recordset verwendet.

Mithilfe der gespeicherten Prozedur können Sie auf eine andere Funktion von ADO zugreifen: die Refresh-Methode der Parameters-Sammlung. Mithilfe dieser Methode kann ADO automatisch alle Informationen zu den Parametern ausfüllen, die vom Befehl zur Laufzeit benötigt werden. Beim Verwenden dieser Technik treten Leistungseinbußen auf, da ADO die Datenquelle für die Informationen zu den Parametern abfragen muss.

Weitere wichtige Unterschiede bestehen zwischen dem folgenden Codebeispiel und dem Code in den Befehlsobjektparametern, in die die Parameter manuell eingegeben wurden. Erstens legt dieser Code die Prepared-Eigenschaft nicht auf True fest, da es sich um eine gespeicherte SQL Server-Prozedur handelt, die nach Definition vorkompiliert ist. Zweitens wurde die CommandType-Eigenschaft des Command-Objekts im zweiten Beispiel in adCmdStoredProc geändert, um ADO zu informieren, dass es sich bei dem Befehl um eine gespeicherte Prozedur gehandelt hatte.

Schließlich muss im zweiten Beispiel beim Festlegen des Werts mit einem Index auf den Parameter verwiesen werden, da Sie zur Entwurfszeit möglicherweise den Namen des Parameters nicht kennen. Wenn Sie den Namen des Parameters kennen, können Sie die neue NamedParameters-Eigenschaft des Command-Objekts auf „True“ festlegen und auf den Namen der Eigenschaft verweisen. Sie fragen sich vielleicht, warum die Position des ersten in der gespeicherten Prozedur erwähnten Parameters (@CustomerID) 1 lautet anstatt 0 (objCmd(1) = "ALFKI"). Dies liegt daran, dass der Parameter „0“ einen Rückgabewert aus der gespeicherten SQL Server-Prozedur enthält.

'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  

Weitere Informationen

Wissensdatenbankartikel 117500