Поделиться через


Вызов хранимой процедуры с помощью команды

Область применения: 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