Obtendo valores de retorno de uma stored procedure com ADO


Como você deve saber, a Transact SQL usada no SQL Server lhe permite definir parâmetros de retorno nas stored procedures. Estes parâmetros  permitem que o Transact SQL retorne valores para o código executando a stored procedure. Em geral, parâmetros de retorno são mais eficientes que recordsets para retornar valores únicos porque eles não requerem recursos adicionais de um cursor, etc.

Para recuperar um valor de retorno via ADO no VB, você primeiro cria um objeto Parameter, indicando que ele é um parâmetro de saída ( ou um parâmetro de entrada e saída ). Você então adiciona o parâmetro a um objeto Command do mesmo modo que faz quando passa um parâmetro de entrada. Após o seu código executar o Command, o SQL Server e o ADO preencherão o objeto Parameter com o valor apropriado. 

Para ver como isto funciona, considere a seguinte stored procedure criada com o Transact SQL:

CREATE PROCEDURE [sp_BookList] 
(@ISBN as varchar(30),
@TotalDollar as money OUTPUT)
AS

SELECT @TotalDollar = 404.32
GO

Normalmente, este procedimento seria usado para retornar um valor total em dólares no inventário de um livro específico. Para tornar as coisas simples, codificamos de modo fixo o valor de retorno. Para retornar o parâmetro de saída no VB, você usaria o código abaixo: 

Private Sub Form_Load()
Dim cmd As New ADODB.Command
Dim param1 As New ADODB.Parameter
Dim param2 As New ADODB.Parameter

With cmd
.CommandText = "sp_BookList"
.CommandType = adCmdStoredProc
.ActiveConnection = CONN_STRING
Set param1 = .CreateParameter("ISBN", adVarChar, adParamInput, 30, "90023433")
.Parameters.Append param1

Set param2 = .CreateParameter("TotalDollar", adCurrency, adParamOutput)
.Parameters.Append param2

.Execute Options:=adExecuteNoRecords
Set .ActiveConnection = Nothing
Set param1 = Nothing
End With


Note que, no método Execute, nós especificamos adExecuteNoRecords. Desta forma, dizemos ao ADO para não se preocupar em criar e preencher um recordset para conter o valor de retorno.

Uma vez executado, o seu código pode obter o valor do parâmetro de saída de duas formas: ou acessando a coleção Parameters, ou usando o objeto Parameter diretamente. O código a seguir ilustra ambos os métodos e conclui o código do procedimento anterior.

MsgBox FormatCurrency(param2.Value, 2)
MsgBox FormatCurrency(cmd.Parameters("TotalDollar"), 2)

Set param2 = Nothing
Set cmd = Nothing
End Sub