Partilhar via


Chamando um procedimento armazenado com um comando

Você pode usar um comando para chamar um procedimento armazenado. O exemplo de código no final deste tópico refere-se a um procedimento armazenado no banco de dados de exemplo Northwind, chamado CustOrdersOrders, que é definido da seguinte maneira.

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

Consulte a documentação do SQL Server para obter mais informações sobre como definir e chamar procedimentos armazenados.

Esse procedimento armazenado é semelhante ao comando usado em parâmetros de objeto de comando . Ele usa um parâmetro de ID do cliente e retorna informações sobre os pedidos desse cliente. O exemplo de código a seguir usa esse procedimento armazenado como a origem de um conjunto de registros do ADO.

O uso do procedimento armazenado permite que você acesse outra funcionalidade do ADO: a coleção Parameters do método Refresh. Usando esse método, o ADO pode preencher automaticamente todas as informações sobre os parâmetros exigidos pelo comando em tempo de execução. Há uma penalidade de desempenho ao usar essa técnica, pois o ADO deve consultar a fonte de dados para obter as informações sobre os parâmetros.

Existem outras diferenças importantes entre o exemplo de código a seguir e o código em parâmetros de objeto de comando, em que os parâmetros foram inseridos manualmente. Primeiro, esse código não define a propriedade Prepared para True porque é um procedimento armazenado do SQL Server e é pré-compilado por definição. Em segundo lugar, a propriedade CommandType do objeto Command foi alterada para adCmdStoredProc no segundo exemplo para informar ao ADO que se tratava de um procedimento armazenado.

Por fim, no segundo exemplo, o parâmetro deve ser referenciado pelo índice ao definir o valor, pois talvez você não saiba o nome do parâmetro no momento do design. Se você souber o nome do parâmetro, poderá definir a nova propriedade NamedParameters do objeto command como True e fazer referência ao nome da propriedade. Você pode se perguntar por que a posição do primeiro parâmetro mencionado no procedimento armazenado (@CustomerID) é 1 em vez de 0 (objCmd(1) = "ALFKI"). Isso ocorre porque o parâmetro 0 contém um valor retornado do procedimento armazenado do 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  

Consulte Também

Artigo da Base de Conhecimento 117500