Вызов хранимой процедуры с помощью команды
Область применения: Access 2013, Office 2013
Вы также можете использовать команду при вызове хранимой процедуры. Следующий код вызывает хранимую процедуру в образце базы данных Northwind с именем CustOrdersOrders, которая определяется следующим образом:
CREATE PROCEDURE CustOrdersOrders @CustomerID nchar(5) AS
SELECT OrderID, OrderDate, RequiredDate, ShippedDate
FROM Orders
WHERE CustomerID = @CustomerID
ORDER BY OrderID
Эта хранимая процедура аналогична команде, используемой в параметрах командного объекта, в том, что она принимает параметр идентификатора клиента и возвращает сведения о заказах этого клиента. В приведенном ниже коде эта хранимая процедура используется в качестве источника для набора записей ADO.
Использование хранимой процедуры позволяет получить доступ к другой возможности ADO: методу Refresh коллекции параметров. С помощью этого метода ADO может автоматически заполнять все сведения о параметрах, необходимых команде во время выполнения. При использовании этого метода существует снижение производительности, так как ADO должен запрашивать источник данных для получения сведений о параметрах.
Другие важные различия существуют между приведенным ниже кодом и кодом в параметрах командного объекта, где параметры были введены вручную. Во-первых, этот код не задает для свойства Prepared значение True, так как оно является SQL Server хранимой процедурой и предварительно компилируется по определению. Во-вторых, во втором примере свойство CommandType объекта Commandизменено на adCmdStoredProc , чтобы сообщить ADO, что команда является хранимой процедурой.
'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