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